C#指南,重溫基礎,展望遠方!(2)程序結構
C# 中的關鍵組織結構概念包括程序、命名空間、類型、成員和程序集。 C# 程序由一個或多個源文件組成。 程序聲明類型,而類型則包含成員,並被整理到命名空間中。 類型示例包括類和接口。 成員示例包括字段、方法、屬性和事件。 編譯完的 C# 程序實際上會打包到程序集中。 程序集的文件擴展名通常為 .exe
或 .dll
,具體取決於實現的是應用程序還是庫。
以下示例在 Acme.Collections
命名空間中聲明 Stack
類:
using System;
namespace Acme.Collections
{
public class Stack
{
Entry top;
public void Push(object data)
{
top = new Entry(top, data);
}
public object Pop()
{
if (top == null)
{
throw new InvalidOperationException();
}
object result = top.data;
top = top.next;
return result;
}
class Entry
{
public Entry next;
public object data;
public Entry(Entry next, object data)
{
this.next = next;
this.data = data;
}
}
}
}
此類的完全限定的名稱為 Acme.Collections.Stack
。 此類包含多個成員:一個 top
字段、兩個方法(Push
和 Pop
)和一個 Entry
嵌套類。 Entry
類還包含三個成員:一個 next
字段、一個 data
字段和一個構造函數。 假定示例的源代碼存儲在 acme.cs
文件中,以下命令行
csc /t:library acme.cs
將示例編譯成庫(不含 Main
入口點的代碼),並生成 acme.dll
程序集。
重要
上述示例使用 csc
作為命令行 C# 編譯器。 此編譯器是 Windows 可執行文件。 若要在其他平臺上使用 C#,應使用 .NET Core 工具。 .NET Core 生態系統使用 dotnet
程序集包含中間語言 (IL) 指令形式的可執行代碼和元數據形式的符號信息。 執行前,程序集中的 IL 代碼會被 .NET 公共語言運行時的實時 (JIT) 編譯器自動轉換成處理器專屬代碼。
由於程序集是包含代碼和元數據的自描述功能單元,因此無需在 C# 中使用 #include
指令和頭文件。 只需在編譯程序時引用特定的程序集,即可在 C# 程序中使用此程序集中包含的公共類型和成員。 例如,此程序使用 acme.dll
程序集中的 Acme.Collections.Stack
using System;
using Acme.Collections;
class Example
{
static void Main()
{
Stack s = new Stack();
s.Push(1);
s.Push(10);
s.Push(100);
Console.WriteLine(s.Pop());
Console.WriteLine(s.Pop());
Console.WriteLine(s.Pop());
}
}
如果程序存儲在文件 example.cs
中,那麽在 example.cs
編譯完後,可以使用編譯器的 /r 選項引用 acme.dll 程序集:
csc /r:acme.dll example.cs
這會創建 example.exe
可執行程序集,它將在運行時輸出以下內容:
100
10
1
使用 C#,可以將程序的源文本存儲在多個源文件中。 編譯多文件 C# 程序時,可以將所有源文件一起處理,並且源文件可以隨意相互引用。從概念上講,就像是所有源文件在處理前被集中到一個大文件中一樣。 在 C# 中,永遠都不需要使用前向聲明,因為聲明順序無關緊要(除了極少數的例外情況)。 C# 並不限制源文件只能聲明一種公共類型,也不要求源文件的文件名必須與其中聲明的類型相匹配。
C#指南,重溫基礎,展望遠方!(2)程序結構