詳談.NET值類型和引用類型
對(duì)于如何更好的理解.NET值類型和引用類型,我們將從內(nèi)存的基本布局開(kāi)始入手,希望通過(guò)本文能對(duì)大家了解.NET值類型和引用類型有所幫助。
深入理解.NET值類型和引用類型,這是.NET開(kāi)發(fā)人員取得長(zhǎng)期成功的關(guān)鍵,下面從內(nèi)存布局角度詳細(xì)給大家說(shuō)明一下值類型和引用類型:
值類型的內(nèi)存結(jié)構(gòu):
引用類型的內(nèi)存結(jié)構(gòu):
引用類型的實(shí)例比值類型的實(shí)例多了兩個(gè)附加的字段,SyncBlockIndex和RTTI(運(yùn)行時(shí)類型信息)指針,指向一個(gè)方法表結(jié)構(gòu),所以描述為 MethodTablePtr和TypeObjectPtr都是可以的,〈CLR Via C#〉這本書(shū)的第一版標(biāo)注的是MethodTablePtr,第二版標(biāo)注的是TypeObjectPtr,這里應(yīng)該是Jeffery認(rèn)為 TypeObjectPtr更加準(zhǔn)確。
另外,除Object和ValueType類型以外,值類型不能繼承其他任何類型,同時(shí)也無(wú)法作為其他值類型的基類,所以一般情況下,也就無(wú)需方法表指針 了!需要調(diào)用調(diào)用從Object或ValueType繼承的一些方法的時(shí)候,需要一個(gè)方法表指針,這時(shí)就需要對(duì)值類型進(jìn)行裝箱!
看一個(gè)例子:
- public struct A
- {
- public overrid String ToString()
- {
- return "A++";
- }
- }
- static void Main(string[] args)
- {
- A a=new A();
- a.ToString();//這時(shí)不會(huì)發(fā)生裝箱,因?yàn)镃#編譯器發(fā)現(xiàn)結(jié)構(gòu)體A重寫(xiě)了ToString方法,于是產(chǎn)生直接調(diào)用ToString的IL指 令,而且不可能有類型繼承自結(jié)構(gòu)體A,所以編譯器可以確定這里不會(huì)有多態(tài)性的行為,于是就無(wú)須方法表指針,也無(wú)須裝箱!
- a.GetType();//這里會(huì)發(fā)生裝箱,因?yàn)榻Y(jié)構(gòu)體A本身沒(méi)有實(shí)現(xiàn)GetType方法,需要調(diào)用繼承的GetType方法,這時(shí)需要一個(gè)方法表指針來(lái)訪問(wèn)方法表,這時(shí)需要通過(guò)裝箱來(lái)獲得!
原文標(biāo)題:從內(nèi)存布局角度談?wù)勚殿愋秃鸵妙愋停?/FONT>
鏈接:http://www.cnblogs.com/xuefeng1982/archive/2009/10/09/1579816.html
【編輯推薦】