參考以下博文,我這里只是筆記一下,原文會更加詳細
c#基礎系列1---深入理解值型別和參考型別
堆疊和托管堆c#
值型別和參考型別
紅色表示——“這啥?”(真實1個問題引出3個問題)
CLR支持的兩種型別

參考型別:
參考型別從托管堆上分配,new運算子會回傳物件的指標——指向物件資料的記憶體位置的一個參考,參考型別傳遞的是物件的指標(string特殊),參考型別的變數都需要一次堆記憶體的分配,
值型別:
值型別一般在執行緒堆疊上分配,一個值型別變數包含了其實體的值,沒有參考指標,

相同點:
都是System.Object的子類,
值型別也可以繼承介面,
不同點:
1、 值型別分配在堆疊上,參考型別在托管堆上分配;
如果一個參考型別的某個屬性是值型別,這個值型別也分配在托管堆上,
2、 所有的值型別都是隱式密封的(sealed),不能繼承,

3、 值型別的賦值逐欄位的復制,頻繁賦值也會造成性能上的壓力;參考型別的賦值只是指標傳遞,
4、 參考型別額外有型別物件指標和同步塊索引,
5、 值型別繼承自System.ValueType;參考型別繼承自System.Object,System.ValueType也繼承自System.Object,System.ValueType重寫了Equals和GetHashCode方法
性能:
值型別分配在堆疊上,在GC控制外,不會對GC造成壓力;

參考型別分配在堆中,會影響到GC,每一次到堆的記憶體分配都有可能進行一次垃圾收集操作,
裝箱拆箱:
裝箱是將值型別轉化為參考型別,拆箱則是將參考型別轉化為值型別,
裝箱:
1、 在托管堆中分配好了記憶體,分配的記憶體量為值型別的各個欄位需要的記憶體量加上托管上物件的兩個額外成員(型別物件指標,同步塊索引)需要的記憶體量
2、 值型別的欄位復制到新分配的堆記憶體中,
3、 回傳物件的地址,這個地址就是這個物件的參考,
拆箱:
1、 獲取已經裝箱的值型別實體的指標,
2、 把獲取到的值復制到堆疊,
(拆箱只能還原為原先未裝箱之前的型別)
裝箱比較耗費性能,還可能引起GC操作
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/108751.html
標籤:C#
下一篇:并行編程和任務(二)
