使用結構 (C# 程式設計手冊)
更新: 2008 年 7 月
struct 型別很適合用於代表輕量型物件,例如 Point、Rectangle 和 Color。雖然使用自動實作屬性可以很輕鬆地將一個點表示為一個類別,但是在某些案例中結構會更有效率。例如,如果宣告一個含有 1000 個 Point 物件的陣列,您需要配置額外的記憶體來參考每一個物件,而在這種情況下,使用結構所耗用的記憶體會較少。因為 .NET Framework 含有一個名為 Point 的物件,所以本範例中的結構改稱為 "CoOrds"。
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
為結構定義預設的 (無參數的) 建構函式 (Constructor) 是錯誤的。初始化結構主體中的執行個體欄位時,也會發生錯誤。您必須使用參數化建構函式或在宣告結構後個別存取成員,如此才能初始化結構成員。任何 private 或其他無法存取的成員,都只能在建構函式中初始化。
當您使用 new 運算子建立結構物件時,不僅會建立物件,還會呼叫適當的建構函式。與類別不同的是,結構並不需要使用 new 運算子就能執行個體化。在這種情況中不會有建構函式呼叫,這樣可使得配置更有效率。不過,欄位會維持未指派狀態,而且必須等到所有的欄位都初始化後才能使用物件。
當結構含有參考型別 (Reference Type) 的成員時,必須明確地叫用 (Invoke) 成員的預設建構函式,否則成員會維持未指派狀態,結構也將無法使用 (這會產生編譯器錯誤 CS0171)。
不同於類別,結構沒有繼承。結構無法從另一個結構或類別繼承而來,且它不能成為類別的基底。然而,結構可以從基底類別 Object 繼承而來。結構可以實作介面,而且它的作法就跟類別一樣。
不同於 C++,您不能使用關鍵字 struct 來宣告類別。在 C# 裡,類別和結構在語意上是不同的。結構是實值型別,而類別是參考型別。如需詳細資訊,請參閱實值型別。
除非您需要參考型別語意,否則可以將小型類別當做結構,系統處理起來可能會更有效率。
範例 1
說明
下列程式碼中,示範了使用預設和參數型建構函式初始化 struct。
程式碼
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
// Declare and initialize struct objects.
class TestCoOrds
{
static void Main()
{
// Initialize:
CoOrds coords1 = new CoOrds();
CoOrds coords2 = new CoOrds(10, 10);
// Display results:
Console.Write("CoOrds 1: ");
Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
Console.Write("CoOrds 2: ");
Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
CoOrds 1: x = 0, y = 0
CoOrds 2: x = 10, y = 10
*/
範例 2
說明
這個範例示範了結構特有的功能。它在建立 CoOrds 物件時並沒有使用 new 運算子。如果您用關鍵字 class 取代 struct,程式將無法編譯。
程式碼
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
// Declare a struct object without "new."
class TestCoOrdsNoNew
{
static void Main()
{
// Declare an object:
CoOrds coords1;
// Initialize:
coords1.x = 10;
coords1.y = 20;
// Display results:
Console.Write("CoOrds 1: ");
Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output: CoOrds 1: x = 10, y = 20
請參閱
概念
參考
變更記錄
日期 |
記錄 |
原因 |
---|---|---|
2008 年 7 月 |
加入關於 CS0171 的段落 |
內容 Bug 修正。 |