国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

深入解析C#編程中struct所定義的結構

2020-01-24 01:18:49
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐业县| 磐石市| 宜川县| 孟州市| 宜兴市| 玉溪市| 凤冈县| 德惠市| 西充县| 三明市| 凤翔县| 汉沽区| 河源市| 喜德县| 富平县| 南投市| 观塘区| 福海县| 宜川县| 大新县| 华阴市| 孙吴县| 宜宾市| 江津市| 镇远县| 育儿| 胶南市| 越西县| 绥江县| 苍溪县| 韩城市| 寻乌县| 龙海市| 天镇县| 珠海市| 揭东县| 抚远县| 彰武县| 绵竹市| 中牟县| 隆昌县|