使用命名空间(C# 编程指南)
在 C# 程序中,通过两种方式来大量使用命名空间。首先,.NET Framework 类使用命名空间来组织它的众多类。其次,在较大的编程项目中,声明自己的命名空间可以帮助控制类和方法名的范围。
访问命名空间
大多数 C# 应用程序从一个 using 指令节开始。该节列出应用程序将会频繁使用的命名空间,避免程序员在每次使用其中包含的方法时都要指定完全限定的名称。
例如,通过在程序开头包括行:
using System;
程序员可以使用代码:
Console.WriteLine("Hello, World!");
而不是:
System.Console.WriteLine("Hello, World!");
命名空间别名
using 指令(C# 参考)还可用于创建命名空间的别名。例如,如果使用包含嵌套命名空间的以前编写的命名空间,您可能希望声明一个别名来提供引用特定命名空间的简写方法,如以下示例中所示:
using Co = Company.Proj.Nested; // define an alias to represent a namespace
使用命名空间来控制范围
namespace 关键字用于声明一个范围。在项目中创建范围的能力有助于组织代码,并可让您创建全局唯一的类型。在下面的示例中,名为 SampleClass 的类在两个命名空间中定义,其中一个命名空间嵌套在另一个之内。.运算符(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 则嵌套在其中。
下面的示例中有嵌套的类和命名空间。在每个实体的后面,需要完全限定名作为注释。
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 内:
namespace N1.N2
{
class C3 // N1.N2.C3
{
}
}
一般情况下,应使用 :: 来引用命名空间别名或使用 global:: 来引用全局命名空间,并使用 . 来限定类型或成员。
与引用类型而不是命名空间的别名一起使用 :: 是错误的。例如:
using Alias = System.Console;
class TestClass
{
static void Main()
{
// Error
//Alias::WriteLine("Hi");
// OK
Alias.WriteLine("Hi");
}
}
记住单词 global 不是预定义的别名,因此 global.X 没有任何特殊的含义。仅当与 :: 一起使用时,它才获得特殊的含义。
定义名为 global 的别名会生成编译器警告 CS0440,因为 global:: 始终引用全局命名空间而不是别名。例如,下面的行将产生警告:
using global = System.Collections; // Warning
最好将 :: 与别名一起使用,这样可以避免意外引入其他类型。以下面的代码为例:
using Alias = System;
namespace Library
{
public class C : Alias.Exception { }
}
这样做可行,但是如果接着引入一个名为 Alias 的类型,则 Alias. 将改为绑定到该类型。使用 Alias::Exception 可以确保 Alias 被当作命名空间别名,而不会被误认为类型。
有关 global 别名的更多信息,请参见主题如何:使用全局命名空间别名(C# 编程指南)。