值類型和引用類型

一、值類型和引用類型的定義和區(qū)別

1.值類型包括基礎(chǔ)類型(int坞生、float仔役、bool)、枚舉類型enum是己、結(jié)構(gòu)體類型struct又兵。派生自System.ValueType(繼承Object)。

? 引用類型包括類Class沛厨、接口Interface、委托delegate摔认、數(shù)組ArrayList、字符串String参袱。派生自O(shè)bject。

? 擴(kuò)展:ValueType重寫了Equals()方法蓖柔,從而對值類型按照實(shí)例的值來比較,而不是引用地址來比較况鸣。

? Vector3牢贸、Quaternion是值類型潜索,GameObject、Transform是引用類型懂酱。

2.值類型存儲的是變量實(shí)際的值,引用類型存儲的是變量的內(nèi)存地址列牺,指向托管堆內(nèi)存。

3.值類型存儲在棧上,引用類型存儲在托管堆上(地址存在棧上)泌辫。

? ?擴(kuò)展:棧是有序、連續(xù)的內(nèi)存域震放,由系統(tǒng)自動分配和維護(hù)宾毒,需要在編譯期間預(yù)先分配好內(nèi)存大小。

? ? ? ? ? ? ?堆是無序殿遂、不連續(xù)的內(nèi)存域诈铛,由用戶自己控制釋放或者觸發(fā)GC。

4.值類型在賦值時墨礁,會生成獨(dú)立的數(shù)據(jù)副本幢竹,修改新值時,舊的變量不受影響饵溅。

? 引用類型在賦值時妨退,傳遞的是內(nèi)存地址,新數(shù)據(jù)和舊數(shù)據(jù)指向同一個托管堆數(shù)據(jù)蜕企,修改任意一個值時咬荷,另一個也會變化。

5.值類型不可以派生轻掩,不可以為空幸乒。引用類型可以派生,可以為空唇牧。

值類型賦值
引用類型賦值

二罕扎、裝箱和拆箱

裝箱和拆箱的定義:

裝箱是值類型轉(zhuǎn)換為引用類型的過程 ;

拆箱是引用類型轉(zhuǎn)換為值類型的過程。

int value = 10;

object obj = value;? ? ? ? ? ? ? ? ?//裝箱

int newValue = (int)obj;? ? ? ? ? //拆箱


裝箱和拆箱的內(nèi)存操作:

裝箱操作:

1.生成一個新的引用類型丐重,在托管堆中分配內(nèi)存腔召。(分配內(nèi)存)

2.將值類型數(shù)據(jù)拷貝到分配的內(nèi)存中。(數(shù)據(jù)拷貝)

3.返回托管堆對象的地址扮惦。

裝箱過程

拆箱操作:

1.獲取托管堆中值類型部分字段的地址臀蛛。

2.將引用對象的值拷貝到棧上的新實(shí)例中。

拆箱過程

什么時候會發(fā)生裝箱/拆箱:

1.一個包含參數(shù)類型為Object的方法崖蜜,調(diào)用該方法時傳入了值類型參數(shù)浊仆,會發(fā)生裝箱。

2.使用非泛型容器(如ArrayList)豫领,將值類型加入容器時抡柿,會發(fā)生裝箱。


如何避免裝箱和拆箱的性能開銷:

裝箱操作會生成新的引用對象并賦值等恐,并且造成GC洲劣,會造成較大的開銷备蚓,因此需要盡量避免:

1.針對上述情況1,使用重載方法避免裝箱闪檬。

2.針對上述情況2星著,使用泛型容器避免裝箱。

3.對于多次裝箱操作粗悯,可以考慮提前進(jìn)行顯式裝箱,減少裝箱次數(shù)同欠。


三样傍、值類型和引用類型的嵌套

1.值類型嵌套定義引用類型(struct結(jié)構(gòu)包含class):

? ?值類型嵌套定義引用類型時衫哥,棧上將保存該引用類型的地址襟锐,而實(shí)際的數(shù)據(jù)則依然保存在托管堆中。


? ?//值類型嵌套定義引用類型的情況

????public struct Temp

????{

????????//結(jié)構(gòu)體字段蚊荣,注意:結(jié)構(gòu)體中字段不能被初始化

????????private TestClass testClass;

????????//結(jié)構(gòu)體的構(gòu)造函數(shù)互例,注意:結(jié)構(gòu)體中不能顯式定義無參的構(gòu)造函數(shù)

????????public Temp(TestClass t)

????? ? {

????????if(t ==null)

????????????thrownewArgumentNullException("t");

? ? ? ? testClass = t;

? ? ? ? testClass.x =10;

? ? ? ? testClass.y =20;

? ? }

}

值類型嵌套引用類型


2.引用類型嵌套定義值類型(class包含值類型):

? ?i.類的字段類型是值類型媳叨,它將作為引用類型實(shí)例的一部分关顷,被分配到托管堆中议双。

? ?ii.但那些作為局部變量的值類型,則仍然會被分配到線程棧中夫偶。

public classTest

{

????// num作為引用類型的一部分被分配到托管堆上

????private int num =10;

????public void Temp()

? ? {

????????// d被分配到線程棧上

????????double d =3.14;

? ? }

}

引用類型嵌套值類型
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兵拢,一起剝皮案震驚了整個濱河市说铃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腻扇,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窒篱,死亡現(xiàn)場離奇詭異墙杯,居然都是意外死亡括荡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門嫉髓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來算行,“玉大人纱意,你說我怎么就攤上這事鲸阔。” “怎么了褐筛?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長硫狞。 經(jīng)常有香客問我晃痴,道長,這世上最難降的妖魔是什么泣侮? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任活尊,我火速辦了婚禮,結(jié)果婚禮上蛹锰,老公的妹妹穿的比我還像新娘。我一直安慰自己舞终,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布权埠。 她就那樣靜靜地躺著,像睡著了一般龙屉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上作岖,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天痘儡,我揣著相機(jī)與錄音枢步,去河邊找鬼。 笑死矾瑰,一個胖子當(dāng)著我的面吹牛隘擎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播采幌,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼休傍,長吁一口氣:“原來是場噩夢啊……” “哼尼夺!你這毒婦竟也來了炒瘸?” 一聲冷哼從身側(cè)響起顷扩,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤隘截,失蹤者是張志新(化名)和其女友劉穎汹胃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犀农,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呵哨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年孟害,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挨务。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡玉组,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谷誓,到底是詐尸還是另有隱情吨凑,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布糙臼,位于F島的核電站恩商,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏揽乱。R本人自食惡果不足惜名眉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一损拢、第九天 我趴在偏房一處隱蔽的房頂上張望撒犀。 院中可真熱鬧,春花似錦荆姆、人聲如沸映凳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽队询。三九已至蚌斩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間范嘱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工叠聋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碌补,地道東北人棉饶。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像袜啃,于是被迫代替她去往敵國和親幸缕。 傳聞我的和親對象是個殘疾皇子晰韵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

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