ZT 值類型和引用類型深入理解

http://www.cnblogs.com/zengming/p/6037048.html


1.值類型(ValueType)

值類型包括:數(shù)值類型昔善,結(jié)構(gòu)體,bool型耕挨,用戶定義的結(jié)構(gòu)體,枚舉,可空類型迄靠。

值類型的變量直接存儲(chǔ)數(shù)據(jù),分配在托管棧中喇辽。變量會(huì)在創(chuàng)建它們的方法返回時(shí)自動(dòng)釋放掌挚,例如在一個(gè)方法中聲明Char型的變量name=’C’,當(dāng)實(shí)例化它的方法結(jié)束時(shí)菩咨,name變量在棧上占用的內(nèi)存就會(huì)自動(dòng)釋放

C#的所有值類型均隱式派生自System.ValueType吠式。

結(jié)構(gòu)體:struct(直接派生于System.ValueType)。

數(shù)值類型:整型抽米,sbyte(System.SByte的別 名)特占,short(System.Int16),int(System.Int32)云茸,long(System.Int64)是目,byte(System.Byte),ushort(System.UInt16)标捺,uint(System.UInt32)懊纳,ulong(System.UInt64)网持,char(System.Char)。

浮點(diǎn)型:float(System.Single)长踊,double(System.Double)功舀。

財(cái)務(wù)計(jì)算的高精度decimal型:decimal(System.Decimal)。

bool型:bool(System.Boolean的別名)身弊。

用戶定義的結(jié)構(gòu)體(派生于System.ValueType)辟汰。

枚舉:enum(派生于System.Enum)。

可空類型(派生于System.Nullable泛型結(jié)構(gòu)體阱佛,T?實(shí)際上是System.Nullable的別名

2.引用類型(ReferenceType)

引用類型包括:數(shù)組帖汞,用戶定義的類、接口凑术、委托翩蘸,object,字符串淮逊,null類型催首,類。

引用類型的變量持有的是數(shù)據(jù)的引用泄鹏,數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)堆郎任,分配在托管堆中,變量并不會(huì)在創(chuàng)建它們的方法結(jié)束時(shí)釋放內(nèi)存备籽,它們所占用的內(nèi)存會(huì)被CLR中的垃圾回收機(jī)制釋放舶治。

數(shù)組(派生于System.Array)

用戶需定義以下類型:

類:class(派生于System.Object);

接口:interface(接口不是一個(gè)“東西”车猬,所以不存在派生于何處的問題霉猛。接口只是表示一種contract約定[contract])。

委托:delegate(派生于System.Delegate)珠闰。

object(System.Object的別名)惜浅;

字符串:string(System.String的別名)。

3.值類型與引用類型區(qū)別:


值類型和引用類型樹形結(jié)構(gòu):

注:給參數(shù)加了fef(out)后铸磅,參數(shù)是引用傳遞赡矢,這時(shí)候傳遞的是棧地址(指針杭朱,引用)阅仔,否則就是正常的值傳遞---棧原始數(shù)據(jù)的拷貝。

4.內(nèi)存分配

值類型的實(shí)例經(jīng)常會(huì)存儲(chǔ)在棧上的弧械。但是也有特殊情況八酒。如果某個(gè)類的實(shí)例有個(gè)值類型的字段,那么實(shí)際上該字段會(huì)和類實(shí)例保存在同一個(gè)地方刃唐,即堆中羞迷。不過引用類型的對象總是存儲(chǔ)在堆中界轩。如果一個(gè)結(jié)構(gòu)的字段是引用類型,那么只有引用本身是和結(jié)構(gòu)實(shí)例存儲(chǔ)在一起的(在椣挝停或堆上浊猾,視情況而定)。

引用類型在棧中存儲(chǔ)一個(gè)引用热鞍,其實(shí)際的存儲(chǔ)位置位于托管堆葫慎。簡稱引用類型部署在托管推上。值類型總是分配在它聲明的地方:作為字段時(shí)薇宠,跟隨其所屬的變量(實(shí)例)存儲(chǔ)偷办;作為局部變量時(shí),存儲(chǔ)在棧上澄港。值類型在內(nèi)存管理方面具有更好的效率椒涯,并且不支持多態(tài),適合用做存儲(chǔ)數(shù)據(jù)的載體回梧;引用類型支持多態(tài)废岂,適合用于定義

應(yīng)用程序的行為。

注:堆棧(stack)是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)狱意。在內(nèi)存中泪喊,變量會(huì)被分配在堆棧上來進(jìn)行操作。堆(heap)是用于為類型實(shí)例(對象)分配空間的內(nèi)存區(qū)域髓涯,在堆上創(chuàng)建一個(gè)對象袒啼,會(huì)將對象的地址傳給堆棧上的變量(反過來叫變量指向此對象,或者變量引用此對象)纬纪。

5.裝箱和拆箱

1)裝箱就是將一個(gè)值類型轉(zhuǎn)換成等值的引用類型

在堆上為新生成的對象(該對象包含數(shù)據(jù)蚓再,對象本身沒有名稱)分配內(nèi)存。

將堆棧上值類型變量的值拷貝到堆上的對象中包各。

將堆上創(chuàng)建的對象的地址返回給引用類型變量(從程序員角度看摘仅,這個(gè)變量的名稱就好像堆上對象的名稱一樣)。

2)拆箱就是將一個(gè)引用類型轉(zhuǎn)換成等值的值類型

將引用類型變量堆上的值拷貝到棧上面问畅。

總結(jié)

值類型和引用類型理解透徹后娃属,我們知道C#里面是值傳遞,但是有些變量是引用類型的护姆,在傳遞和拷貝時(shí)需要特別注意矾端。方法傳遞參數(shù)時(shí)加上ref(out),為引用傳遞參數(shù)卵皂。

值傳遞僅僅傳遞的是值秩铆,不影響原始值。

引用傳遞,傳遞的是內(nèi)存地址殴玛,修改后會(huì)改變內(nèi)存地址對應(yīng)儲(chǔ)存的值捅膘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市滚粟,隨后出現(xiàn)的幾起案子寻仗,更是在濱河造成了極大的恐慌,老刑警劉巖凡壤,帶你破解...
    沈念sama閱讀 212,949評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愧沟,死亡現(xiàn)場離奇詭異,居然都是意外死亡鲤遥,警方通過查閱死者的電腦和手機(jī)沐寺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,772評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盖奈,“玉大人混坞,你說我怎么就攤上這事「痔梗” “怎么了究孕?”我有些...
    開封第一講書人閱讀 158,419評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爹凹。 經(jīng)常有香客問我厨诸,道長,這世上最難降的妖魔是什么禾酱? 我笑而不...
    開封第一講書人閱讀 56,812評論 1 285
  • 正文 為了忘掉前任微酬,我火速辦了婚禮,結(jié)果婚禮上颤陶,老公的妹妹穿的比我還像新娘颗管。我一直安慰自己,他們只是感情好滓走,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,927評論 6 386
  • 文/花漫 我一把揭開白布垦江。 她就那樣靜靜地躺著,像睡著了一般搅方。 火紅的嫁衣襯著肌膚如雪比吭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,102評論 1 291
  • 那天姨涡,我揣著相機(jī)與錄音衩藤,去河邊找鬼。 笑死绣溜,一個(gè)胖子當(dāng)著我的面吹牛慷彤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怖喻,決...
    沈念sama閱讀 39,171評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼底哗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锚沸?” 一聲冷哼從身側(cè)響起跋选,我...
    開封第一講書人閱讀 37,921評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哗蜈,沒想到半個(gè)月后前标,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,366評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡距潘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,675評論 2 327
  • 正文 我和宋清朗相戀三年炼列,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片音比。...
    茶點(diǎn)故事閱讀 38,820評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俭尖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洞翩,到底是詐尸還是另有隱情稽犁,我是刑警寧澤,帶...
    沈念sama閱讀 34,523評論 4 335
  • 正文 年R本政府宣布骚亿,位于F島的核電站已亥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏来屠。R本人自食惡果不足惜虑椎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,162評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俱笛。 院中可真熱鬧绣檬,春花似錦、人聲如沸嫂粟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,885評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽星虹。三九已至零抬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宽涌,已是汗流浹背平夜。 一陣腳步聲響...
    開封第一講書人閱讀 32,126評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卸亮,地道東北人忽妒。 一個(gè)月前我還...
    沈念sama閱讀 46,647評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親段直。 傳聞我的和親對象是個(gè)殘疾皇子吃溅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,732評論 2 351

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

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司鸯檬,掛了不少决侈,但最終還是拿到小米、百度喧务、阿里赖歌、京東、新浪功茴、CVTE庐冯、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,218評論 11 349
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法坎穿,內(nèi)部類的語法展父,繼承相關(guān)的語法,異常的語法赁酝,線程的語...
    子非魚_t_閱讀 31,603評論 18 399
  • JVM內(nèi)存模型Java虛擬機(jī)(Java Virtual Machine=JVM)的內(nèi)存空間分為五個(gè)部分犯祠,分別是: ...
    光劍書架上的書閱讀 2,493評論 2 26
  • 一、運(yùn)行時(shí)數(shù)據(jù)區(qū)域 Java虛擬機(jī)管理的內(nèi)存包括幾個(gè)運(yùn)行時(shí)數(shù)據(jù)內(nèi)存:方法區(qū)酌呆、虛擬機(jī)棧衡载、本地方法棧、堆隙袁、程序計(jì)數(shù)器痰娱,...
    加油小杜閱讀 1,515評論 1 15
  • 1,感恩我自己一直踏著喜悅之道菩收,做自己喜歡做的事情梨睁,做到極致,對結(jié)果零期待 2娜饵,感恩我自己自從開始學(xué)習(xí)靈修之后坡贺,對...
    陳笑舒閱讀 226評論 0 0