在 C# 程序中,通过两种方式来大量使用命名空间。首先,.NET Framework 类使用命名空间来组织它的众多类。其次,在较大的编程项目中,声明自己的命名空间可以帮助控制类和方法名的范围。
访问命名空间
大多数 C# 应用程序从一个 using 指令节开始。该节列出应用程序将会频繁使用的命名空间,避免程序员在每次使用其中包含的方法时都要指定完全限定的名称。
例如,通过在程序开头包括行:
C# | ![]() |
---|---|
using System; |
程序员可以使用代码:
C# | ![]() |
---|---|
Console.WriteLine("Hello, World!"); |
而不是:
C# | ![]() |
---|---|
System.Console.WriteLine("Hello, World!"); |
命名空间别名
using 指令(C# 参考)还可用于创建命名空间的别名。例如,如果使用包含嵌套命名空间的以前编写的命名空间,您可能希望声明一个别名来提供引用特定命名空间的简写方法,比如:
C# | ![]() |
---|---|
using Co = Company.Proj.Nested; // define an alias to represent a namespace |
使用命名空间来控制范围
namespace 关键字用于声明一个范围。在项目中创建范围的能力有助于组织代码,并提供创建全局唯一的类型的途径。在下面的示例中,名为 SampleClass
的类在两个命名空间中定义,其中一个命名空间嵌套在另一个之内。. 运算符(C# 参考)用于区分所调用的方法。
C# | ![]() |
---|---|
namespace SampleNamespace { class SampleClass { public void SampleMethod() { System.Console.WriteLine( "SampleMethod inside SampleNamespace"); } } // Create a nested namespace, and define another class. namespace NestedNamespace { class SampleClass { public void SampleMethod() { System.Console.WriteLine( "SampleMethod inside NestedNamespace"); } } } class Program { static void Main(string[] args) { // Displays "SampleMethod inside SampleNamespace." SampleClass outer = new SampleClass(); outer.SampleMethod(); // Displays "SampleMethod inside SampleNamespace." SampleNamespace.SampleClass outer2 = new SampleNamespace.SampleClass(); outer2.SampleMethod(); // Displays "SampleMethod inside NestedNamespace." NestedNamespace.SampleClass inner = new NestedNamespace.SampleClass(); inner.SampleMethod(); } } } |
完全限定名
命名空间和类型的名称必须唯一,由指示逻辑层次结构的完全限定名描述。例如,语句 A.B
表示 A
是命名空间或类型的名称,而 B
则嵌套在其中。
下面的示例中有嵌套的类和命名空间。在每个实体的后面,需要完全限定名作为注释。
C# | ![]() |
---|---|
namespace N1 // N1 { class C1 // N1.C1 { class C2 // N1.C1.C2 { } } namespace N2 // N1.N2 { class C2 // N1.N2.C2 { } } } |
以上代码段中:
-
命名空间
N1
是全局命名空间的成员。它的完全限定名是N1
。 -
命名空间
N2
是命名空间N1
的成员。它的完全限定名是N1.N2
。 -
类
C1
是N1
的成员。它的完全限定名是N1.C1
。 -
在此代码中使用了两次
C2
类名。但是,完全限定名是唯一的。第一个类名在C1
内声明;因此其完全限定名是:N1.C1.C2
。第二个类名在命名空间N2
内声明;因此其完全限定名是:N1.N2.C2
。
使用以上代码段,可以用以下方法将新的类成员 C3,
添加到命名空间 N1.N2
内:
C# | ![]() |
---|---|
namespace N1.N2 { class C3 // N1.N2.C3 { } } |
一般情况下,应使用 :: 来引用命名空间别名或使用 global:: 来引用全局命名空间,并使用 . 来限定类型或成员。
与引用类型而不是命名空间的别名一起使用 :: 是错误的。例如:
C# | ![]() |
---|---|
using Alias = System.Console; |
C# | ![]() |
---|---|
class TestClass { static void Main() { // Error //Alias::WriteLine("Hi"); // OK Alias.WriteLine("Hi"); } } |
务必牢记单词 global 不是预定义的别名,因此 global.X
没有任何特殊的含义。仅当与 :: 一起使用时,它才获得特殊的含义。
定义名为 global 的别名将会产生警告(请参见
C# | ![]() |
---|---|
using global = System.Collections; // Warning |
然而最好与别名一起使用 ::,这样可以避免引入意料之外的其他类型。以下面的代码为例:
C# | ![]() |
---|---|
using Alias = System; |
C# | ![]() |
---|---|
namespace Library { public class C : Alias.Exception { } } |
这样做可行,但是如果接着引入一个名为 Alias
的类型,则 Alias.
将改为绑定到该类型。使用 Alias::Exception
可以确保 Alias
被当作命名空间别名,而不会被误认为类型。
有关 global 别名的更多细节,请参考主题如何:使用命名空间别名限定符(C# 编程指南)。