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ǔ)存的值捅膘。