結構是使用 struct 關鍵字定義的,例如:
public struct PostalAddress{ // Fields, properties, methods and events go here...}
結構與類共享大多數相同的語法,但結構比類受到的限制更多:
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; }}
為結構定義默認(無參數)構造函數是錯誤的。在結構體中初始化實例字段也是錯誤的。只能通過兩種方式初始化結構成員:一是使用參數化構造函數,二是在聲明結構后分別訪問成員。對于任何私有成員或以其他方式設置為不可訪問的成員,只能在構造函數中進行初始化。
如果使用 new 運算符創建結構對象,則會創建該結構對象,并調用適當的構造函數。與類不同,結構的實例化可以不使用 new 運算符。在此情況下不存在構造函數調用,因而可以提高分配效率。但是,在初始化所有字段之前,字段將保持未賦值狀態且對象不可用。
當結構包含引用類型作為成員時,必須顯式調用該成員的默認構造函數,否則該成員將保持未賦值狀態且該結構不可用。(這將導致編譯器錯誤 CS0171。)
對于結構,不像類那樣存在繼承。一個結構不能從另一個結構或類繼承,而且不能作為一個類的基。但是,結構從基類 Object 繼承。結構可實現接口,其方式同類完全一樣。
無法使用 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(); }}
輸出:
CoOrds 1: x = 0, y = 0 CoOrds 2: x = 10, y = 10
示例 2
描述
下面舉例說明了結構特有的一種功能。它在不使用 new 運算符的情況下創建 CoOrds 對象。如果將 struct 換成 class,程序將不會編譯。
代碼
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(); }}
輸出:
CoOrds 1: x = 10, y = 20
新聞熱點
疑難解答