深刻解析C#編程中struct所界說的構造。本站提示廣大學習愛好者:(深刻解析C#編程中struct所界說的構造)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析C#編程中struct所界說的構造正文
構造是應用 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