值型別與引用型別的區別
阿新 • • 發佈:2018-12-05
值型別
struct結構,enum列舉
結構包括:
簡單結構(int,char,float,double,bool.....),使用者自定義的結構體,
引用型別
類,陣列,介面,代理
類包括
object,string,使用者自定義類
區別
(1)值型別存在棧上
引用型別儲存在堆上
c#的值型別是為變數在棧上分配了一塊記憶體,用於儲存資料,而引用型別分為兩部分,宣告時只在棧上分配了一小部分記憶體, 堆上沒分配,而new引用變數時,是在堆上分配了一塊記憶體,儲存的是棧上的記憶體地址。
引用型別在棧中儲存一個引用,其實際的儲存位置位於託管堆。簡稱引用型別部署在託管推上。而 值型別總是分配在它宣告 的 地方:作為欄位時,跟隨其所屬的變數(例項)儲存;作為區域性變數時,儲存在棧上。(棧的記憶體是自動釋放的,堆內 存 是.NET中會由GC來自動釋放)
(2)引用型別可以派生出新的型別,而值型別不能
(3)引用型別可以包含null值,值型別不能(可空型別功能允許將 null 賦給值型別)
注意:struct是值型別,string和class是引用型別,string不需要new是因為想要語義化“,引 用型別和值型別都繼承自System.Object類。不同的是,幾乎所有的引用型別都直接從System.Object繼承,而值型別則繼承其子類,即 直接繼承System.ValueType。 即System.ValueType本身是一個類型別,而不是值型別。其關鍵在於ValueType重寫了Equals()方法,從而對值型別按照例項的值來比較,而不是引用地址來比較。
本文部分引用:http://blog.csdn.net/qiaoquan3/article/details/51202926 作者:HawkJony