Class和Struct的區(qū)別

class 和 struct 最本質(zhì)的區(qū)別 : class 是引用類型,它在堆中分配空間蹦渣,棧中保存的只是引用哄芜;而 struct 是值類型,它在棧中分配空間柬唯。

什么是class?

class(類)是面向?qū)ο缶幊痰幕靖拍钪抑颍且环N自定義數(shù)據(jù)結(jié)構(gòu)類型,通常包含字段权逗、屬性美尸、方法、構(gòu)造函數(shù)斟薇、索引器师坎、操作符等。在.NET中堪滨,所有的類都最終繼承自 System.Object 類胯陋,因此是一種引用類型,也就是說袱箱,new 一個(gè)類的實(shí)例時(shí)遏乔,在棧(stack)上存放該實(shí)例在托管堆(Managed Heap)中的地址,而實(shí)例的值保存在托管堆(Managed Heap)中发笔。

托管堆Managed Heap) :托管堆分配在被操作系統(tǒng)保留的一段內(nèi)存區(qū)域中盟萨,這段內(nèi)存區(qū)域是由 CLR 來管理的,這段內(nèi)存稱之為托管堆了讨。

什么是struct?

struct(結(jié)構(gòu))是一種值類型捻激,用于將一組相關(guān)的變量組織為一個(gè)單一的變量實(shí)體 。所有的結(jié)構(gòu)直接派生自 System.ValueType前计,間接派生自System.Object胞谭,但結(jié)構(gòu)是隱式密封的,不能作為基類再派生出其他的結(jié)構(gòu)男杈,也不能從類派生丈屹,但可以從接口派生。struct 實(shí)例在創(chuàng)建時(shí)分配在線程的棧(stack)上伶棒,它本身存儲(chǔ)了值旺垒。所以在使用 struct 時(shí)彩库,我們可以將其當(dāng)作 int、char 這樣的基本類型對待袖牙。

publicstructAddressBook

{

//構(gòu)造器、字段舅锄、屬性鞭达、方法、事件

}


class是引用類型皇忿,struct是值類型畴蹭;既然 class 是引用類型,class 可以設(shè)為 null鳍烁;但是我們不能將 struct 設(shè)為 null叨襟,因?yàn)樗侵殿愋汀?/p>

當(dāng)你實(shí)例化一個(gè) class,它將創(chuàng)建在【堆】上幔荒。而你實(shí)例化一個(gè) struct糊闽,它將創(chuàng)建在【棧】上爹梁。

你使用的是一個(gè)對 class 實(shí)例的引用右犹。而你使用的不是對一個(gè) struct 的引用(而是直接使用它們)。

當(dāng)我們將 class 作為參數(shù)傳給一個(gè)方法姚垃,我們傳遞的是一個(gè)引用念链。struct 傳遞的是值而非引用。

class 可以定義析構(gòu)器积糯,但是 struct 不可以掂墓。

class可以有顯示的無參構(gòu)造器,但是 struct不可以看成。

class 的構(gòu)造器不需要初始化全部字段君编,struct 的構(gòu)造器必須初始化所有字段。

struct 在聲明時(shí)不能對實(shí)例字段進(jìn)行賦值川慌。

class使用前必須new關(guān)鍵字實(shí)例化(靜態(tài)類除外)啦粹,struct不需要。

class 支持繼承和多態(tài)窘游,struct 不支持唠椭。注意:但是 struct 可以和類一樣實(shí)現(xiàn)接口。

既然 struct 不支持繼承忍饰,其成員不能以 protected?或 protected internal 修飾贪嫂。

class 比較適合大的和復(fù)雜的數(shù)據(jù),struct 適用于作為經(jīng)常使用的一些數(shù)據(jù)組合成的新類型艾蓝。

struct 類型總是隱式密封的力崇,因此在定義結(jié)構(gòu)時(shí)不能使用 sealed 和 abstract 關(guān)鍵字斗塘。

struct的函數(shù)成員不能聲明為 abstract 和 virtual,但是可以使用 override 關(guān)鍵字亮靴,用以覆寫它的基類 System.ValueType 中的方法馍盟。


適用場合:

struct 有性能優(yōu)勢,class 有面向?qū)ο蟮臄U(kuò)展優(yōu)勢.

由于結(jié)構(gòu)是值類型茧吊,并且直接存儲(chǔ)數(shù)據(jù)贞岭,因此在一個(gè)對象的主要成員為數(shù)據(jù)且數(shù)據(jù)量不大的情況下,使用結(jié)構(gòu)會(huì)帶來更好的性能.

將一個(gè)結(jié)構(gòu)變量賦值給另一個(gè)結(jié)構(gòu)變量搓侄,就是把數(shù)據(jù)從一個(gè)結(jié)構(gòu)復(fù)制到另一個(gè)結(jié)構(gòu)瞄桨。而類則不同,在類的變量之間讶踪,復(fù)制的是引用芯侥,而不是類數(shù)據(jù).

當(dāng)把一個(gè)結(jié)構(gòu)類型的變量賦值給另一個(gè)結(jié)構(gòu)時(shí),對性能的影響取決于結(jié)構(gòu)的大小乳讥,當(dāng)數(shù)據(jù)比較大的時(shí)候柱查,這種數(shù)據(jù)復(fù)制機(jī)制會(huì)帶來較大的開銷.

對于點(diǎn)、矩形和顏色這樣的輕量對象云石,假如要聲明一個(gè)含有許多個(gè)顏色對象的數(shù)組物赶,則 CLR 需要為每個(gè)對象分配內(nèi)存,在此情況下留晚,使用結(jié)構(gòu)的成本較低.

當(dāng)堆棧的空間很有限酵紫,且有大量的邏輯對象時(shí),創(chuàng)建類要比創(chuàng)建結(jié)構(gòu)好一些.

在表現(xiàn)抽象和多級別的對象層次時(shí)错维,類是最好的選擇奖地,因?yàn)榻Y(jié)構(gòu)不支持繼承.

用于底層數(shù)據(jù)存儲(chǔ)的類型設(shè)計(jì)為 struct 類型,將用于定義應(yīng)用程序行為的類型設(shè)計(jì)為 class赋焕。如果對類型將來的應(yīng)用情況不能確定参歹,應(yīng)該使用 class.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市隆判,隨后出現(xiàn)的幾起案子犬庇,更是在濱河造成了極大的恐慌,老刑警劉巖侨嘀,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臭挽,死亡現(xiàn)場離奇詭異,居然都是意外死亡咬腕,警方通過查閱死者的電腦和手機(jī)欢峰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纽帖,你說我怎么就攤上這事宠漩。” “怎么了懊直?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵扒吁,是天一觀的道長。 經(jīng)常有香客問我室囊,道長雕崩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任波俄,我火速辦了婚禮晨逝,結(jié)果婚禮上蛾默,老公的妹妹穿的比我還像新娘懦铺。我一直安慰自己,他們只是感情好支鸡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布冬念。 她就那樣靜靜地躺著,像睡著了一般牧挣。 火紅的嫁衣襯著肌膚如雪急前。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天瀑构,我揣著相機(jī)與錄音裆针,去河邊找鬼。 笑死寺晌,一個(gè)胖子當(dāng)著我的面吹牛世吨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呻征,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耘婚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了陆赋?” 一聲冷哼從身側(cè)響起沐祷,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎攒岛,沒想到半個(gè)月后赖临,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灾锯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年思杯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡色乾,死狀恐怖誊册,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情暖璧,我是刑警寧澤案怯,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站澎办,受9級特大地震影響嘲碱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜局蚀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一麦锯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琅绅,春花似錦扶欣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至澎羞,卻和暖如春髓绽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妆绞。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工顺呕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人括饶。 一個(gè)月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓株茶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親巷帝。 傳聞我的和親對象是個(gè)殘疾皇子忌卤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容