命名空间提供了一种组织相关类和其他类型的方式与文件或组件不同命名空间是一种逻辑组合而不是物理组合在C#文件中定义类时可以把它包括在命名空间定义中以后在定义另一个类在另一个文件中执行相关操作时就可以在同一个命名空间中包含它创建一个逻辑组合告诉使用类的其他开发人员这两个类是如何相关的以及如何使用它们:
namespace CustomERPhoneBookApp
{
using System;
public struct Subscriber
{
// Code for struct here
}
}
把一个类型放在命名空间中可以有效地给这个类型指定一个较长的名称该名称包括类型的命名空间后面是句点()和类的名称在上面的例子中Subscriber结构的全名是CustomerPhoneBookAppSubscriber这样有相同短名的不同的类就可以在同一个程序中使用了
也可以在命名空间中嵌套其他命名空间为类型创建层次结构:
namespace Wrox
{
namespace ProCSharp
{
namespace Basics
{
class NamespaceExample
{
// Code for the class here
}
}
}
}
每个命名空间名都由它所在命名空间的名称组成这些名称用句点分隔开首先是最外层的命名空间最后是它自己的短名所以ProfessionalCSharp命名空间的全名是WroxProCSharpNamespaceExample类的全名是WroxProCSharpBasicsNamespaceExample
使用这个语法也可以组织自己的命名空间定义中的命名空间所以上面的代码也可以写为:
namespace WroxProCSharpBasics
{
class NamespaceExample
{
// Code for the class here
}
}
注意不允许在另一个嵌套的命名空间中声明多部分的命名空间
命名空间与程序集无关同一个程序集中可以有不同的命名空间也可以在不同的程序集中定义同一个命名空间中的类型
using语句
显然命名空间相当长键入起来很繁琐用这种方式指定某个特定的类也是不必要的如本章开头所述C#允许简写类的全名为此要在文件的顶部列出类的命名空间前面加上using关键字在文件的其他地方就可以使用其类型名称来引用命名空间中的类型了:
using System;
using WroxProCSharp;
如前所述所有的C#源代码都以语句using System;开头这仅是因为Microsoft提供的许多有用的类都包含在System命名空间中
如果using指令引用的两个命名空间包含同名的类就必须使用完整的名称(或者至少较长的名称)确保编译器知道访问哪个类型例如类NamespaceExample同时存在于WroxProCSharpBasics和WroxProCSharpOOP命名空间中如果要在命名空间WroxProCSharp中创建一个类Test并在该类中实例化一个NamespaceExample类就需要指定使用哪个类:
using WroxProCSharp;
class Test
{
public static int Main()
{
BasicsNamespaceExample nSEx = new BasicsNamespaceExample();
//do something with the nSEx variable
return ;
}
}
因为using语句在C#文件的开头C和C++也把#include放在这里所以从C++迁移到C#的程序员常把命名空间与C++风格的头文件相混淆不要犯这种错误using语句在这些文件之间并没有真正建立物理链接C#也没有对应于C++头文件的部分
公司应花一定的时间开发一种命名空间模式这样其开发人员才能快速定位他们所需要的功能而且公司内部使用的类名也不会与外部的类库相沖突本章后面将介绍建立命名空间模式的规则和其他命名约定
命名空间的别名
using关键字的另一个用途是给类和命名空间指定别名如果命名空间的名称非常长又要在代码中使用多次但不希望该命名空间的名称包含在using指令中(例如避免类名沖突)就可以给该命名空间指定一个别名其语法如下:
using alias = NamespaceName;
下面的例子(前面例子的修订版本)给WroxProCSharpBasics命名空间指定别名Introduction并使用这个别名实例化了一个NamespaceExample对象这个对象是在该命名空间中定义的它有一个方法GetNamespace()该方法调用每个类都有的GetType()方法以访问表示类的类型的Type对象下面使用这个对象来返回类的命名空间名:
using System;
using Introduction = WroxProCSharpBasics;
class Test
{
public static int Main()
{
IntroductionNamespaceExample NSEx =new IntroductionNamespaceExample();
ConsoleWriteLine(NSExGetNamespace());
return ;
}
}
namespace WroxProCSharpBasics
{
class NamespaceExample
{
public string GetNamespace()
{
return thisGetType()Namespace;
}
}
}