標籤:重寫 執行個體 數值 char csdn 並且 判斷 定義 size
C#實值型別和參考型別區別
實值型別包括byte,short,int,long,float,double,decimal,char,bool 和 struct ,枚舉,可空類型。實值型別變數聲明後,不管是否已經賦值,編譯器為其分配記憶體;
參考型別包括string 和 class,數組,介面,委託,object。當聲明一個類時,只在棧中分配一小片記憶體用於容納一個地址,而此時並沒有為其分配堆上的記憶體空間。當使用 new 建立一個類的執行個體時,分配堆上的空間,並把堆上空間的地址儲存到棧上分配的小片空間中。
實值型別的執行個體通常是線上程棧上分配的(靜態分配),但是在某些情形下可以儲存在堆中。參考型別的對象總是在進程堆中分配(動態分配)。
需要注意的是:引 用類型和實值型別都繼承自System.Object類。不同的是,幾乎所有的參考型別都直接從System.Object繼承,而實值型別則繼承其子類System.ValueType。System.ValueType直接派生於System.Object。即System.ValueType本身是一個類類型,而不是實值型別。其關鍵在於ValueType重寫了Equals()方法,從而對實值型別按照執行個體的值來比較,而不是引用地址來比較。
可以用Type.IsValueType屬性來判斷一個類型是否為實值型別,
參考型別與實值型別相同的是,結構體也可以實現介面;
參考型別可以派生出新的類型,而實值型別不能;
參考型別可以包含null值,實值型別不能(可空類型功能允許將 null 賦給實值型別);
參考型別變數的賦值只複製對對象的引用,而不複製對象本身。而將一個實值型別變數賦給另一個實值型別變數時,將複製包含的值。
實值型別和參考型別的區別 相同點:參考型別可以實現介面,實值型別當中的結構體也可以實現介面;參考型別和實值型別都繼承自System.Object類。 不同點:1)範圍
C#的實值型別包括:結構體(數實值型別、bool型、使用者自訂的結構體),枚舉,可空類型。
C#的參考型別包括:數組,使用者自訂的類、介面、委託,object,字串。
2)記憶體配置:
數組的元素不管是參考型別還是實值型別,都儲存在託管堆上。
參考型別在棧中儲存一個引用,其實際的儲存位置位於託管堆。簡稱參考型別部署在託管推上。而實值型別總是分配在它聲明的地方:作為欄位時,跟隨其所屬的變數(實 例)儲存;作為局部變數時,儲存在棧上。(棧的記憶體是自動釋放的,堆記憶體是.NET中會由GC來自動釋放)
3)適用場合
實值型別在記憶體管理方面具有更好的效率,並且不支援多態,適合用做儲存資料的載體;參考型別支援多態,適合用於定義應用程式的行為。
1.參考型別可以派生出新的類型,而實值型別不能,因為所有的實值型別都是密封(seal)的;
2.參考型別可以包含null值,實值型別不能(可空類型功能允許將 null 賦給實值型別,如 int? a = null; );
3.參考型別變數的賦值只複製對對象的引用,而不複製對象本身。而將一個實值型別變數賦給另一個實值型別變數時,將複製包含的值。
C# 實值型別和參考型別的區別