|
參考以下博文,我這里只是筆記一下,原文會(huì)更加詳細(xì) c#基礎(chǔ)系列1---深入理解值類(lèi)型和引用類(lèi)型 值類(lèi)型和引用類(lèi)型 紅色表示——“這啥?”(真實(shí)1個(gè)問(wèn)題引出3個(gè)問(wèn)題) CLR支持的兩種類(lèi)型
引用類(lèi)型: 值類(lèi)型: 值類(lèi)型一般在線程棧上分配,一個(gè)值類(lèi)型變量包含了其實(shí)例的值,沒(méi)有引用指針。 相同點(diǎn): 都是System.Object的子類(lèi)。 值類(lèi)型也可以繼承接口。 不同點(diǎn): 1、 值類(lèi)型分配在堆棧上,引用類(lèi)型在托管堆上分配; 如果一個(gè)引用類(lèi)型的某個(gè)屬性是值類(lèi)型,這個(gè)值類(lèi)型也分配在托管堆上。 2、 所有的值類(lèi)型都是隱式密封的(sealed),不能繼承。
3、 值類(lèi)型的賦值逐字段的復(fù)制,頻繁賦值也會(huì)造成性能上的壓力;引用類(lèi)型的賦值只是指針傳遞。 4、 引用類(lèi)型額外有類(lèi)型對(duì)象指針和同步塊索引。 5、 值類(lèi)型繼承自System.ValueType;引用類(lèi)型繼承自System.Object,System.ValueType也繼承自System.Object。System.ValueType重寫(xiě)了Equals和GetHashCode方法 性能: 值類(lèi)型分配在棧上,在GC控制外,不會(huì)對(duì)GC造成壓力;
引用類(lèi)型分配在堆中,會(huì)影響到GC,每一次到堆的內(nèi)存分配都有可能進(jìn)行一次垃圾收集操作。 裝箱拆箱: 裝箱是將值類(lèi)型轉(zhuǎn)化為引用類(lèi)型,拆箱則是將引用類(lèi)型轉(zhuǎn)化為值類(lèi)型。 裝箱: 1、 在托管堆中分配好了內(nèi)存,分配的內(nèi)存量為值類(lèi)型的各個(gè)字段需要的內(nèi)存量加上托管上對(duì)象的兩個(gè)額外成員(類(lèi)型對(duì)象指針,同步塊索引)需要的內(nèi)存量 2、 值類(lèi)型的字段復(fù)制到新分配的堆內(nèi)存中。 3、 返回對(duì)象的地址,這個(gè)地址就是這個(gè)對(duì)象的引用。 拆箱: 1、 獲取已經(jīng)裝箱的值類(lèi)型實(shí)例的指針。 2、 把獲取到的值復(fù)制到棧。 (拆箱只能還原為原先未裝箱之前的類(lèi)型) 裝箱比較耗費(fèi)性能,還可能引起GC操作 |
|
|
來(lái)自: 路人甲Java > 《待分類(lèi)》