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