除了依赖于几个系统提供的类(如 SystemConsole)到目前为止介绍的程序都是独立存在的但更常见的情况是实际的应用程序由若干不同的部分组成每个部分分别进行编译例如企业级应用程序可能依赖于若干不同的组件其中包括某些内部开发的组件和某些从独立软件供应商处购买的组件
命名空间和程序集有助于开发基于组件的系统命名空间提供一个逻辑组织体系命名空间既用作程序的内部组织体系也用作外部组织体系(一种表示向其他程序公开程序元素的途径)
程序集用于物理打包和部署程序集可以包含类型用于实现这些类型的可执行代码以及对其他程序集的引用
有两种主要的程序集应用程序和库应用程序有一个主入口点通常具有 exe 文件扩展名而库没有主入口点通常具有 dll 文件扩展名
为了说明命名空间和程序集的使用本节再次以前面介绍的hello world程序为例并将它分为两个部分提供消息的类库和显示消息的控制台应用程序
这个类库仅含一个名为 HelloMessage 的类示例
// HelloLibrarycs
namespace MicrosoftCSharpIntroduction
{
public class HelloMessage
{
public string Message {
get {
return hello world;
}
}
}
}
显示了名为 MicrosoftCSharpIntroduction 的命名空间中的 HelloMessage 类HelloMessage 类提供一个名为 Message 的只读属性命名空间可以嵌套而声明
namespace MicrosoftCSharpIntroduction
{}
仅是若干层命名空间嵌套的简写形式若不简化则应该像下面这样声明
namespace Microsoft
{
namespace CSharp
{
namespace Introduction
{}
}
}
将hello world组件化的下一个步骤是编写使用 HelloMessage 类的控制台应用程序可以使用此类的完全限定名 MicrosoftCSharpIntroductionHelloMessage但该名称太长使用起来不方便一种更方便的方法是使用using 命名空间指令这样使用相应的命名空间中的所有类型时就不必加限定名称示例
// HelloAppcs
using MicrosoftCSharpIntroduction;
class HelloApp
{
static void Main() {
HelloMessage m = new HelloMessage();
SystemConsoleWriteLine(mMessage);
}
}
显示了一个引用 MicrosoftCSharpIntroduction 命名空间的 using 命名空间指令这样HelloMessage 就成为 MicrosoftCSharpIntroductionHelloMessage 的简写形式
C# 还允许定义和使用别名using 别名指令定义类型的别名当两个类库之间发生名称沖突时或者当使用大得多的命名空间中的少数类型时这类别名很有用示例
using MessageSource = MicrosoftCSharpIntroductionHelloMessage;
显示了一个 using 别名指令该指令将 MessageSource 定义为 HelloMessage 类的别名
我们已编写的代码可以编译为包含类 HelloMessage 的类库和包含类 HelloApp 的应用程序此编译步骤的细节可能因使用的编译器或工具而异使用 Visual Studio NET 中提供的命令行编译器时用如下所列的命令
csc /target:library HelloLibrarycs
csc /reference:HelloLibrarydll HelloAppcs
它产生一个名为 HelloLibrarydll 的类库和一个名为 HelloAppexe 的应用程序