c#結(jié)構(gòu)體與類的區(qū)別-創(chuàng)新互聯(lián)

結(jié)構(gòu)體和類的區(qū)別:
   在做一個(gè)項(xiàng)目時(shí),使用了較多的結(jié)構(gòu)體,并且存在一些結(jié)構(gòu)體的嵌套,即某結(jié)構(gòu)體成員集合包含另一個(gè)結(jié)構(gòu)體等,總是出現(xiàn)一些奇怪的錯(cuò)誤,才終于下決心好好分析一下到底類和結(jié)構(gòu)體有啥不同,雖然它們很相似,但確實(shí)有很大的不同,用不好難免出的問(wèn)題會(huì)比較多,現(xiàn)總結(jié)一下:

一、結(jié)構(gòu)體和類非常相似:

1,定義和使用非常相似,例子如下:
public struct Student
{
   string Name;
   int Age;
}
public class Question
{
   int Number;
    string Content;
}
使用:
Student s=new Student();
Question q=new Question();
2,兩者都是container類型,這表示它們可以包含其他數(shù)據(jù)類型作為成員。

3,兩者都擁有成員,包括:構(gòu)造函數(shù)、方法、屬性、字段、常量、枚舉類型、事件、以及事件處理函數(shù)。

4,兩者的成員都有其各自的存取范圍。例如,可以將某一個(gè)成員聲明為Public,而將另一個(gè)成員聲明為Private。

5,兩者都可以實(shí)現(xiàn)接口。

6,兩者都可以公開一個(gè)默認(rèn)屬性,然而前提是這個(gè)屬性至少要取得一個(gè)自變量。

7,兩者都可以聲明和觸發(fā)事件,而且兩者都可以聲明委托(Delegate)。

二、結(jié)構(gòu)體和類的主要區(qū)別
在網(wǎng)上摘抄了兩段:

=====第一段:=====

1,結(jié)構(gòu)是實(shí)值類型(Value Types),而類則是引用類型(Reference Types)。

2,結(jié)構(gòu)使用棧存儲(chǔ)(Stack Allocation),而類使用堆存儲(chǔ)(Heap Allocation)。

3,所有結(jié)構(gòu)成員默認(rèn)都是Public,而類的變量和常量數(shù)則默認(rèn)位Private,不過(guò)其他類成員默認(rèn)都是Public。

4,結(jié)構(gòu)成員不能被聲明位Protected,而類成員可以。

5,結(jié)構(gòu)變量聲明不能指定初始值、使用New關(guān)鍵字貨對(duì)數(shù)組進(jìn)行初始化,但是類變量聲明可以。

6,結(jié)構(gòu)不能聲明默認(rèn)的構(gòu)造函數(shù),也就是不擁有參數(shù)的非共享構(gòu)造函數(shù),但是類則無(wú)此限制。

7,二者都可以擁有共享構(gòu)造函數(shù),結(jié)構(gòu)的共享構(gòu)造函數(shù)不能帶有參數(shù),但是類的共享構(gòu)造函數(shù)則可以帶或者不帶參數(shù)。

8,結(jié)構(gòu)不允許聲明析構(gòu)函數(shù)(Destructor),類則無(wú)此限制。

9,結(jié)構(gòu)的實(shí)例(Instance)聲明,不允許對(duì)包含的變量進(jìn)行初始化設(shè)定,類則可以在聲明類的實(shí)例時(shí),同時(shí)進(jìn)行變量初始化。

10,結(jié)構(gòu)是隱式繼承自ValueType類,而且不能繼承任何其他類型,類則可以繼續(xù)自ValueType以外的任何類。

11,結(jié)構(gòu)是無(wú)法被繼承的,類則可以。

12,結(jié)構(gòu)永遠(yuǎn)不會(huì)終止,因此CLR不會(huì)在任何結(jié)構(gòu)上調(diào)用Finalize方法。類則是由內(nèi)存回收進(jìn)程加以終止,當(dāng)內(nèi)存回收進(jìn)程檢測(cè)到?jīng)]有任何作用的類時(shí),它就會(huì)調(diào)用類的Finalize方法。

13,結(jié)構(gòu)不需要構(gòu)造函數(shù),類則需要構(gòu)造函數(shù)。

14,結(jié)構(gòu)只能在一種情況下使用非共享構(gòu)造函數(shù),那就是非共享構(gòu)造函數(shù)會(huì)接受參數(shù)。但是類則無(wú)此限制,它可以使用帶參數(shù)或不帶參數(shù)的非共享構(gòu)造函數(shù)。

14,每一個(gè)結(jié)構(gòu)都具有無(wú)參數(shù)的隱含公共構(gòu)造函數(shù),此構(gòu)造函數(shù)會(huì)將結(jié)構(gòu)的所有成員初始化為其默認(rèn)值。不需要重新定義這個(gè)行為。

在“實(shí)例和變量”層面上,由于結(jié)構(gòu)是數(shù)值類型的,因此每一個(gè)結(jié)構(gòu)變量會(huì)永遠(yuǎn)的綁定到結(jié)構(gòu)實(shí)例上。然而類是引用類型的,而且對(duì)象變量可引用不同的類實(shí)例,在此方面的區(qū)別,會(huì)對(duì)使用將結(jié)構(gòu)和類造成如下的影響:

15,結(jié)構(gòu)變量會(huì)隱式的使用結(jié)構(gòu)的無(wú)參數(shù)構(gòu)造函數(shù)來(lái)初始化成員,這就意味語(yǔ)句 Struct S = new Struct()。

16,當(dāng)您將一個(gè)結(jié)構(gòu)變量賦值給另一個(gè),或者將結(jié)構(gòu)實(shí)例傳遞到程序變量時(shí),所有變量成員的值會(huì)復(fù)制到新的結(jié)構(gòu)中。當(dāng)您將一個(gè)對(duì)象變量賦值給另一個(gè),或者將對(duì)象變量傳遞給程序時(shí),則只是復(fù)制指針。

17,您可以將Null值賦值給結(jié)構(gòu)變量,但是該實(shí)例會(huì)一直與該變量保持關(guān)聯(lián)。雖然變量成員會(huì)因此賦值而重新初始化,但是您還是可以調(diào)用變量的方法并訪問(wèn)其數(shù)據(jù)成員。相反的,如果您將對(duì)象變量設(shè)定為Null,您就會(huì)中斷它與任何類型實(shí)例的關(guān)聯(lián),而且除非您再將另一個(gè)實(shí)例賦值給它,否則無(wú)法通過(guò)變量訪問(wèn)任何成員。

18,您可以在不同時(shí)間將不同的類的實(shí)例賦值給同一個(gè)對(duì)象變量,而且在同一時(shí)間可有好幾個(gè)對(duì)象變量引用相同的類實(shí)例,如果您對(duì)類成員值做了改變,則其他指向相同實(shí)例的對(duì)象變量也會(huì)發(fā)生改變。然而,結(jié)構(gòu)成員則會(huì)封裝在他們自己的實(shí)例中,變更結(jié)構(gòu)成員值并不會(huì)對(duì)其他任何結(jié)構(gòu)變量的成員造成影響,甚至也不會(huì)影響相同結(jié)構(gòu)聲明的其他實(shí)例。

19,兩個(gè)結(jié)構(gòu)必須以成員對(duì)成員的比較方式來(lái)執(zhí)行相等比較。兩個(gè)對(duì)象變量可以使用Equals方法來(lái)加以比較。Equals會(huì)判斷兩個(gè)變量是否指向相同的實(shí)例。

=====第二段:=====

1,結(jié)構(gòu)體是一種值類型,而類是引用類型。值類型用于存儲(chǔ)數(shù)據(jù)的值,引用類型用于存儲(chǔ)對(duì)實(shí)際數(shù)據(jù)的引用。那么結(jié)構(gòu)體就是當(dāng)成值來(lái)使用的,類則通過(guò)引用來(lái)對(duì)實(shí)際數(shù)據(jù)操作。
2,結(jié)構(gòu)體的定義是:有些數(shù)據(jù)既是相互關(guān)聯(lián)的,又共同描述一個(gè)完整事物,如:一個(gè)學(xué)生的整體信息,學(xué)號(hào)、姓名、性別等。而類則使用在需要比較有層次的數(shù)據(jù)上面。
3,類是反映現(xiàn)實(shí)事物的一種抽象,而結(jié)構(gòu)體的作用只是一種包含了具體不同類別數(shù)據(jù)的一種包裝,結(jié)構(gòu)體不具備類的繼承多態(tài)特性
4,構(gòu)造函數(shù)是為了初始化類的字段而存在的,而結(jié)構(gòu)體并不需要初始化就能使用,因此,結(jié)構(gòu)體中并不存在默認(rèn)的構(gòu)造函數(shù)。
結(jié)構(gòu):
沒(méi)有默認(rèn)的構(gòu)造函數(shù),但是可以添加構(gòu)造函數(shù)
   沒(méi)有析構(gòu)函數(shù)
   沒(méi)有 abstract 和 sealed(因?yàn)椴荒芾^承)
   不能有protected 修飾符
   可以不使用new 初始化
在結(jié)構(gòu)中初始化實(shí)例字段是錯(cuò)誤的
類:
 有默認(rèn)的構(gòu)造函數(shù)
 有析構(gòu)函數(shù)
 可以使用 abstract 和 sealed
有protected 修飾符
必須使用new 初始化

三.如何選擇結(jié)構(gòu)還是類

1. 堆棧的空間有限,對(duì)于大量的邏輯的對(duì)象,創(chuàng)建類要比創(chuàng)建結(jié)構(gòu)好一些
2.  結(jié)構(gòu)表示如點(diǎn)、矩形和顏色這樣的輕量對(duì)象,例如,如果聲明一個(gè)含有 1000 個(gè)點(diǎn)對(duì)象的數(shù)組,則將為引用每個(gè)對(duì)象分配附加的內(nèi)存。在此情況下,結(jié)構(gòu)的成本較低。
3. 在表現(xiàn)抽象和多級(jí)別的對(duì)象層次時(shí),類是最好的選擇
4. 大多數(shù)情況下該類型只是一些數(shù)據(jù)時(shí),結(jié)構(gòu)時(shí)最佳的選擇

創(chuàng)新互聯(lián)專注于撫遠(yuǎn)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供撫遠(yuǎn)營(yíng)銷型網(wǎng)站建設(shè),撫遠(yuǎn)網(wǎng)站制作、撫遠(yuǎn)網(wǎng)頁(yè)設(shè)計(jì)、撫遠(yuǎn)網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造撫遠(yuǎn)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供撫遠(yuǎn)網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前題目:c#結(jié)構(gòu)體與類的區(qū)別-創(chuàng)新互聯(lián)
分享URL:http://bm7419.com/article30/dsdspo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站做網(wǎng)站、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)