c#中的结构
結(jié)構(gòu)是使用 struct關(guān)鍵字定義的,與類相似,都表示可以包含數(shù)據(jù)成員和函數(shù)成員的數(shù)據(jù)結(jié)構(gòu)。
一般情況下,我們很少使用結(jié)構(gòu),而且很多人也并不建議使用結(jié)構(gòu),但作為.NET Framework 一般型別系統(tǒng)中的一個(gè)基本架構(gòu),還是有必要了解一下的。
結(jié)構(gòu)的特征:
結(jié)構(gòu)是一種值類型,并且不需要堆分配。結(jié)構(gòu)的實(shí)例化可以不使用new運(yùn)算符。
在結(jié)構(gòu)聲明中,除非字段被聲明為 const 或 static,否則無法初始化。結(jié)構(gòu)類型永遠(yuǎn)不是抽象的,并且始終是隱式密封的,因此在結(jié)構(gòu)聲明中不允許使用abstract和sealed修飾符。
結(jié)構(gòu)不能聲明默認(rèn)構(gòu)造函數(shù)(沒有參數(shù)的構(gòu)造函數(shù))或析構(gòu)函數(shù),但可以聲明帶參數(shù)的構(gòu)造函數(shù)。結(jié)構(gòu)可以實(shí)現(xiàn)接口,但不能從另一個(gè)結(jié)構(gòu)或類繼承,而且不能作為一個(gè)類的基,所有結(jié)構(gòu)都直接繼承自 System.ValueType,后者繼承自 System.Object。結(jié)構(gòu)在賦值時(shí)進(jìn)行復(fù)制。將結(jié)構(gòu)賦值給新變量時(shí),將復(fù)制所有數(shù)據(jù),并且對(duì)新副本所做的任何修改不會(huì)更改原始副本的數(shù)據(jù)。在使用值類型的集合(如 Dictionary<string, myStruct>)時(shí),請(qǐng)務(wù)必記住這一點(diǎn)。結(jié)構(gòu)類型的變量直接包含了該結(jié)構(gòu)的數(shù)據(jù),而類類型的變量所包含的只是對(duì)相應(yīng)數(shù)據(jù)的一個(gè)引用(被引用的數(shù)據(jù)稱為“對(duì)象”)。但是結(jié)構(gòu)仍可以通過ref和out參數(shù)引用方式傳遞給函數(shù)成員。結(jié)構(gòu)可用作可以為 null 的類型,因而可向其賦 null 值。structA
??? {publicintx; //不能直接對(duì)其進(jìn)行賦值publicinty;??
??? public static stringstr = null; //靜態(tài)變量可以初始化publicA(intx,inty) //帶參數(shù)的構(gòu)造函數(shù)??
??? {this.x =x;this.y =y;??
??? Console.WriteLine("x={0},y={1},str={2}", x, y,str);??
??? }??
??? }classProgram??
??? {staticvoidMain(string[] args)??
??? {??
??? A a =newA(1,2);??
??? A a1 =a;??
??? a.x =10;??
??? Console.WriteLine("a1.x={0}",a1.x);??
??? Console.Read();??
??? }??
??? }?
結(jié)果為:x=1,y=2,str=
a1.x=1
?
此時(shí)a1.x值為1是因?yàn)?#xff0c;將a賦值給a1是對(duì)值進(jìn)行復(fù)制,因此,a1不會(huì)受到a.x賦值得改變而改變。
但如果A是類,這時(shí)a和a1里的x引用的是同一個(gè)地址,則a1.x的值會(huì)輸出10。
結(jié)構(gòu)的裝箱與拆箱我們知道,一個(gè)類類型的值可以轉(zhuǎn)換為object類型或由該類實(shí)現(xiàn)的接口類型,這只需在編譯時(shí)把對(duì)應(yīng)的引用當(dāng)作另一個(gè)類型處理即可。
與此類似,一個(gè)object類型的值或者接口類型的值也可以被轉(zhuǎn)換回類類型而不必更改相應(yīng)的引用。當(dāng)然,在這種情況下,需要進(jìn)行運(yùn)行時(shí)類型檢查。由于結(jié)構(gòu)不是引用類型,上述操作對(duì)結(jié)構(gòu)類型是以不同的方式實(shí)現(xiàn)的。
當(dāng)結(jié)構(gòu)類型的值被轉(zhuǎn)換為object類型或由該結(jié)構(gòu)實(shí)現(xiàn)的接口類型時(shí),就會(huì)執(zhí)行一次裝箱操作。
反之,當(dāng) object類型的值或接口類型的值被轉(zhuǎn)換回結(jié)構(gòu)類型時(shí),會(huì)執(zhí)行一次拆箱操作。
與對(duì)類類型進(jìn)行的相同操作相比,主要區(qū)別在于:
裝箱操作會(huì)把相關(guān)的結(jié)構(gòu)值復(fù)制為已被裝箱的實(shí)例,而拆箱則會(huì)從已被裝箱的實(shí)例中復(fù)制出一個(gè)結(jié)構(gòu)值。
因此,在裝箱或拆箱操作后,對(duì)“箱”外的結(jié)構(gòu)進(jìn)行的更改不會(huì)影響已被裝箱的結(jié)構(gòu)。structProgram
??? {staticvoidMain(string[] args)??
??? {inti =1;objecto =i; //隱式裝箱?
詳細(xì)請(qǐng)看:http://msdn.microsoft.com/zh-cn/library/0taef578(VS.80).aspx
轉(zhuǎn)載于:https://www.cnblogs.com/ToFlying/p/3543836.html
總結(jié)
- 上一篇: C++的优秀特性2:inline 函数
- 下一篇: c# char unsigned_dll