命名空间与using
什么是命名空间
命名空间(namespace)是一种逻辑分组机制,用于组织代码、避免类型名称冲突。大型项目中不同模块可能定义同名类,命名空间为类型提供了限定路径。
namespace 定义
使用 namespace 关键字声明命名空间,类型放在花括号内。
示例
namespace MyApp.Models
{
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
}
namespace MyApp.Services
{
public class UserService
{
public string GetInfo()
{
return "UserService is ready";
}
}
}
命名空间嵌套
命名空间可以嵌套定义,内层命名空间是外层的子空间。点号访问等价于嵌套结构。
示例
namespace Company
{
namespace Products
{
namespace Electronics
{
public class Phone
{
public string Model { get; set; }
}
}
}
}
namespace Company.Products.Electronics
{
public class Tablet
{
public string Model { get; set; }
}
}
Company.Products.Electronics.Phone 和 Company.Products.Electronics.Tablet 属于同一命名空间。
文件范围命名空间(C# 10)
C# 10 引入文件范围命名空间,使用分号结尾,整个文件自动位于该命名空间中,减少嵌套缩进。
示例
namespace MyApp.Services;
public class EmailService
{
public void Send(string to)
{
System.Console.WriteLine($"Sending email to {to}");
}
}
Sending email to user@example.com
using 指令
using 指令引入命名空间后,可直接使用其中的类型而无需写完全限定名。
示例
using System;
namespace MyApp
{
class Program
{
static void Main()
{
Console.WriteLine("No need for System.Console");
Console.WriteLine(DateTime.Now.Year);
}
}
}
No need for System.Console
2026
using 别名
当命名空间过长或存在同名类型冲突时,可用 using ... = ... 创建别名。
示例
using Dict = System.Collections.Generic.Dictionary<string, int>;
using StringBuilder = System.Text.StringBuilder;
namespace MyApp
{
class Program
{
static void Main()
{
Dict scores = new Dict();
scores.Add("Alice", 95);
scores.Add("Bob", 87);
StringBuilder sb = new StringBuilder();
foreach (var pair in scores)
{
sb.AppendLine($"{pair.Key}: {pair.Value}");
}
System.Console.WriteLine(sb.ToString());
}
}
}
Alice: 95
Bob: 87
using static(C# 6)
using static 引入类型的静态成员,调用时省略类型名。
示例
using static System.Console;
using static System.Math;
namespace MyApp
{
class Program
{
static void Main()
{
WriteLine($"PI = {PI}");
WriteLine($"Max = {Max(10, 20)}");
WriteLine($"Sqrt(144) = {Sqrt(144)}");
}
}
}
PI = 3.14159265358979
Max = 20
Sqrt(144) = 12
全局 using(C# 10)
global using 在一个文件中声明,整个项目所有文件都可使用该命名空间,无需重复 using。
示例
global using System;
global using System.Collections.Generic;
global using System.Linq;
通常将全局 using 放在 GlobalUsings.cs 文件中集中管理。
隐式 using(C# 10)
在项目文件中启用 <ImplicitUsings>enable</ImplicitUsings>,SDK 风格项目会自动添加常用命名空间的 global using。
示例
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>
控制台项目自动包含的命名空间:System、System.Collections.Generic、System.IO、System.Linq、System.Threading、System.Threading.Tasks 等。
using 与 IDisposable
using 语句用于确保 IDisposable 对象在使用后正确释放资源,C# 8 还支持 using 声明语法。
示例
using System;
using System.IO;
namespace MyApp
{
class Program
{
static void Main()
{
using (var fs = new FileStream("test.txt", FileMode.Create))
{
byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello");
fs.Write(data, 0, data.Length);
}
using var reader = new StreamReader("test.txt");
Console.WriteLine(reader.ReadToEnd());
}
}
}
Hello
花括号形式在作用域结束时释放,using var 在变量所在作用域结束时释放。
.NET 类库命名空间组织
.NET 类库按功能模块组织在 System 命名空间下的子空间中。
示例
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace MyApp
{
class Program
{
static void Main()
{
ArrayList list = new ArrayList { 1, 2, 3 };
List<string> names = new List<string> { "Alice", "Bob" };
var upper = names.Select(n => n.ToUpper());
StringBuilder sb = new StringBuilder("Count: ");
sb.Append(names.Count);
Console.WriteLine(sb.ToString());
}
}
}
Count: 2
| 命名空间 | 用途 |
|---|---|
System |
基础类型(Console、DateTime、Math 等) |
System.IO |
文件与流操作 |
System.Collections |
非泛型集合(ArrayList、Hashtable) |
System.Collections.Generic |
泛型集合(List<T>、Dictionary<K,V>) |
System.Linq |
LINQ 查询扩展 |
System.Text |
字符串处理(StringBuilder、Encoding) |
System.Threading |
线程与同步 |
System.Threading.Tasks |
异步编程(Task、Task<T>) |
❓ 常见问题
📖 小节
- 命名空间用
namespace定义,支持花括号嵌套和点号连接 using指令引入命名空间,省略完全限定名using 别名 = 完整类型名解决名称冲突或简化长名称using static引入类型的静态成员,直接调用global using项目级全局可用,避免每文件重复- 文件范围命名空间
namespace X;减少缩进层级 - 隐式 using 通过项目配置自动包含常用命名空间
using语句/声明用于 IDisposable 资源释放- .NET 类库按功能划分为 System 子命名空间
📝 作业
- 创建一个包含两层嵌套命名空间
School.Teachers的类Teacher,并在Main中实例化它 - 使用
using别名为System.Collections.Generic.List<string>创建简短别名,并用该别名创建列表添加元素后输出 - 使用
using static System.Math,直接调用Sqrt、Abs、Round三个方法并输出结果 - 创建一个
GlobalUsings.cs文件,在其中用global using声明System、System.IO、System.Linq,然后在另一个文件中省略这些 using 验证可用 - 分别用花括号
using语句和using var声明两种方式操作StreamWriter写入文件,体会两者区别



