共用方式為


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

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 繼承而來。 結構可以實作介面,而且它的作法就跟類別一樣。

您無法使用關鍵字 struct 來宣告類別。 在 C# 裡,類別和結構在語意上是不同的。 結構是實值型別,而類別是參考型別。 如需詳細資訊,請參閱實值型別

除非您需要參考型別語意,否則如果您將小型類別改宣告為結構,那麼系統處理小型類別時,可能會更有效率。

範例 1

0taef578.collapse_all(zh-tw,VS.110).gif描述

下列程式碼中,示範了使用預設和參數型建構函式初始化 struct。

0taef578.collapse_all(zh-tw,VS.110).gif程式碼

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

0taef578.collapse_all(zh-tw,VS.110).gif描述

這個範例示範了結構特有的功能。 它在建立 CoOrds 物件時並沒有使用 new 運算子。 如果您用關鍵字 class 取代 struct,程式將無法編譯。

0taef578.collapse_all(zh-tw,VS.110).gif程式碼

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# 程式設計手冊