1. 程式人生 > >值型別與引用型別的區別

值型別與引用型別的區別

值型別

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