更新:2007 年 11 月
在 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 类名。但是,完全限定名是唯一的。C2 的第一个实例是在 C1 中声明的;因此,其完全限定名为:N1.C1.C2。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# 编程指南)。