程式|規範|命名空間
除了依賴於幾個系統提供的類(如 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 的應用程式。