深入解析C#編程中struct所定義的結(jié)構(gòu)
結(jié)構(gòu)是使用 struct 關(guān)鍵字定義的,例如:
public struct PostalAddress { // Fields, properties, methods and events go here... }
結(jié)構(gòu)與類(lèi)共享大多數(shù)相同的語(yǔ)法,但結(jié)構(gòu)比類(lèi)受到的限制更多:
- 在結(jié)構(gòu)聲明中,除非字段被聲明為 const 或 static,否則無(wú)法初始化。
- 結(jié)構(gòu)不能聲明默認(rèn)構(gòu)造函數(shù)(沒(méi)有參數(shù)的構(gòu)造函數(shù))或析構(gòu)函數(shù)。
- 結(jié)構(gòu)在賦值時(shí)進(jìn)行復(fù)制。將結(jié)構(gòu)賦值給新變量時(shí),將復(fù)制所有數(shù)據(jù),并且對(duì)新副本所做的任何修改不會(huì)更改原始副本的數(shù)據(jù)。在使用值類(lèi)型的集合(如 Dictionary<string, myStruct>)時(shí),請(qǐng)務(wù)必記住這一點(diǎn)。
- 結(jié)構(gòu)是值類(lèi)型,而類(lèi)是引用類(lèi)型。
- 與類(lèi)不同,結(jié)構(gòu)的實(shí)例化可以不使用 new 運(yùn)算符。
- 結(jié)構(gòu)可以聲明帶參數(shù)的構(gòu)造函數(shù)。
- 一個(gè)結(jié)構(gòu)不能從另一個(gè)結(jié)構(gòu)或類(lèi)繼承,而且不能作為一個(gè)類(lèi)的基。所有結(jié)構(gòu)都直接繼承自 System.ValueType,后者繼承自 System.Object。
- 結(jié)構(gòu)可以實(shí)現(xiàn)接口。
- 結(jié)構(gòu)可用作可以為 null 的類(lèi)型,因而可向其賦 null 值。
struct 類(lèi)型適于表示 Point、Rectangle 和 Color 等輕量對(duì)象。盡管使用自動(dòng)實(shí)現(xiàn)的屬性將一個(gè)點(diǎn)表示為類(lèi)同樣方便,但在某些情況下使用結(jié)構(gòu)更加有效。例如,如果聲明一個(gè) 1000 個(gè) Point 對(duì)象組成的數(shù)組,為了引用每個(gè)對(duì)象,則需分配更多內(nèi)存;這種情況下,使用結(jié)構(gòu)可以節(jié)約資源。因?yàn)?.NET Framework 包含一個(gè)名為 Point 的對(duì)象,所以本示例中的結(jié)構(gòu)命名為“CoOrds”。
public struct CoOrds { public int x, y; public CoOrds(int p1, int p2) { x = p1; y = p2; } }
為結(jié)構(gòu)定義默認(rèn)(無(wú)參數(shù))構(gòu)造函數(shù)是錯(cuò)誤的。在結(jié)構(gòu)體中初始化實(shí)例字段也是錯(cuò)誤的。只能通過(guò)兩種方式初始化結(jié)構(gòu)成員:一是使用參數(shù)化構(gòu)造函數(shù),二是在聲明結(jié)構(gòu)后分別訪問(wèn)成員。對(duì)于任何私有成員或以其他方式設(shè)置為不可訪問(wèn)的成員,只能在構(gòu)造函數(shù)中進(jìn)行初始化。
如果使用 new 運(yùn)算符創(chuàng)建結(jié)構(gòu)對(duì)象,則會(huì)創(chuàng)建該結(jié)構(gòu)對(duì)象,并調(diào)用適當(dāng)?shù)臉?gòu)造函數(shù)。與類(lèi)不同,結(jié)構(gòu)的實(shí)例化可以不使用 new 運(yùn)算符。在此情況下不存在構(gòu)造函數(shù)調(diào)用,因而可以提高分配效率。但是,在初始化所有字段之前,字段將保持未賦值狀態(tài)且對(duì)象不可用。
當(dāng)結(jié)構(gòu)包含引用類(lèi)型作為成員時(shí),必須顯式調(diào)用該成員的默認(rèn)構(gòu)造函數(shù),否則該成員將保持未賦值狀態(tài)且該結(jié)構(gòu)不可用。(這將導(dǎo)致編譯器錯(cuò)誤 CS0171。)
對(duì)于結(jié)構(gòu),不像類(lèi)那樣存在繼承。一個(gè)結(jié)構(gòu)不能從另一個(gè)結(jié)構(gòu)或類(lèi)繼承,而且不能作為一個(gè)類(lèi)的基。但是,結(jié)構(gòu)從基類(lèi) Object 繼承。結(jié)構(gòu)可實(shí)現(xiàn)接口,其方式同類(lèi)完全一樣。
無(wú)法使用 struct 關(guān)鍵字聲明類(lèi)。在 C# 中,類(lèi)與結(jié)構(gòu)在語(yǔ)義上是不同的。結(jié)構(gòu)是值類(lèi)型,而類(lèi)是引用類(lèi)型。
除非需要引用類(lèi)型語(yǔ)義,將較小的類(lèi)聲明為結(jié)構(gòu),可以提高系統(tǒng)的處理效率。
示例 1
描述
下面的示例演示使用默認(rèn)構(gòu)造函數(shù)和參數(shù)化構(gòu)造函數(shù)的 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
描述
下面舉例說(shuō)明了結(jié)構(gòu)特有的一種功能。它在不使用 new 運(yùn)算符的情況下創(chuàng)建 CoOrds 對(duì)象。如果將 struct 換成 class,程序?qū)⒉粫?huì)編譯。
代碼
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
上一篇:C#利用delegate實(shí)現(xiàn)Javascript的each方法
欄 目:C#教程
本文標(biāo)題:深入解析C#編程中struct所定義的結(jié)構(gòu)
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6753.html
您可能感興趣的文章
- 01-10C#編程實(shí)現(xiàn)自定義熱鍵的方法
- 01-10C#編程獲取資源文件中圖片的方法
- 01-10深入淺出23種設(shè)計(jì)模式
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類(lèi)型和變量二
- 01-10C#編程自學(xué)之開(kāi)篇介紹
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類(lèi)型和變量三
- 01-10C#編程自學(xué)之運(yùn)算符和表達(dá)式
- 01-10C#編程自學(xué)之類(lèi)和對(duì)象
- 01-10C#編程和Visual Studio使用技巧(下)
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類(lèi)型和變量一


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法