程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 深刻解析C#編程中struct所界說的構造

深刻解析C#編程中struct所界說的構造

編輯:C#入門知識

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


構造是應用 struct 症結字界說的,例如:

public struct PostalAddress
{
 // Fields, properties, methods and events go here...
}

構造與類同享年夜多半雷同的語法,但構造比類遭到的限制更多:

  • 在構造聲明中,除非字段被聲明為 const 或 static,不然沒法初始化。
  • 構造不克不及聲明默許結構函數(沒有參數的結構函數)或析構函數。
  • 構造在賦值時停止復制。將構造賦值給新變量時,將復制一切數據,而且對新正本所做的任何修正不會更改原始正本的數據。在應用值類型的聚集(如 Dictionary<string, myStruct>)時,請務必記住這一點。
  • 構造是值類型,而類是援用類型。
  • 與類分歧,構造的實例化可以不應用 new 運算符。
  • 構造可以聲明帶參數的結構函數。
  • 一個構造不克不及從另外一個構造或類繼續,並且不克不及作為一個類的基。一切構造都直接繼續自 System.ValueType,後者繼續自 System.Object。
  • 構造可以完成接口。
  • 構造可用作可認為 null 的類型,因此可向其賦 null 值。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved