除了依賴於幾個系統提供的類(如 System.Console),到目前為止介紹的程序都是獨立存在的。但更常見的情況是:實際的應用程序由若干不同的部分組成,每個部分分別進行編譯。例如,企業級應用程序可能依賴於若干不同的組件,其中包括某些內部開發的組件和某些從獨立軟件供應商處購買的組件。
命名空間和程序集有助於開發基於組件的系統。命名空間提供一個邏輯組織體系。命名空間既用作程序的“內部”組織體系,也用作“外部”組織體系(一種表示向其他程序公開程序元素的途徑)。
程序集用於物理打包和部署。程序集可以包含類型、用於實現這些類型的可執行代碼以及對其他程序集的引用。
有兩種主要的程序集:應用程序和庫。應用程序有一個主入口點,通常具有 .exe 文件擴展名;而庫沒有主入口點,通常具有 .dll 文件擴展名。
為了說明命名空間和程序集的使用,本節再次以前面介紹的“hello, world”程序為例,並將它分為兩個部分:提供消息的類庫和顯示消息的控制台應用程序。
這個類庫僅含一個名為 HelloMessage 的類。示例
// HelloLibrary.cs
namespace Microsoft.CSharp.Introduction
{
public class HelloMessage
{
public string Message {
get {
return "hello, world";
}
}
}
}
顯示了名為 Microsoft.CSharp.Introduction 的命名空間中的 HelloMessage 類。HelloMessage 類提供一個名為 Message 的只讀屬性。命名空間可以嵌套,而聲明
namespace Microsoft.CSharp.Introduction
{...}
僅是若干層命名空間嵌套的簡寫形式。若不簡化,則應該像下面這樣聲明:
namespace Microsoft
{
namespace CSharp
{
namespace Introduction
{...}
}
}
將“hello, world”組件化的下一個步驟是編寫使用 HelloMessage 類的控制台應用程序。可以使用此類的完全限定名 Microsoft.CSharp.Introduction.HelloMessage,但該名稱太長,使用起來不方便。一種更方便的方法是使用“using 命名空間指令”,這樣,使用相應的命名空間中的所有類型時就不必加限定名稱。示例
// HelloApp.cs
using Microsoft.CSharp.Introduction;
class HelloApp
{
static void Main() {
HelloMessage m = new HelloMessage();
System.Console.WriteLine(m.Message);
}
}
顯示了一個引用 Microsoft.CSharp.Introduction 命名空間的 using 命名空間指令。這樣,HelloMessage 就成為 Microsoft.CSharp.Introduction.HelloMessage 的簡寫形式。
C# 還允許定義和使用別名。using 別名指令定義類型的別名。當兩個類庫之間發生名稱沖突時,或者當使用大得多的命名空間中的少數類型時,這類別名很有用。示例
using MessageSource = Microsoft.CSharp.Introduction.HelloMessage;
顯示了一個 using 別名指令,該指令將 MessageSource 定義為 HelloMessage 類的別名。
我們已編寫的代碼可以編譯為包含類 HelloMessage 的類庫和包含類 HelloApp 的應用程序。此編譯步驟的細節可能因使用的編譯器或工具而異。使用 Visual Studio .Net 中提供的命令行編譯器時,用如下所列的命令:
csc /target:library HelloLibrary.cs
csc /reference:HelloLibrary.dll HelloApp.cs
它產生一個名為 HelloLibrary.dll 的類庫和一個名為 HelloApp.exe 的應用程序。