共用方式為


使用結構 (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

請參閱

概念

C# 程式設計手冊

參考

類別和結構 (C# 程式設計手冊)

結構 (C# 程式設計手冊)

變更記錄

日期

記錄

原因

2008 年 7 月

加入關於 CS0171 的段落

內容 Bug 修正。