天天看點

C# 值類型與引用類型

1、值類型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 統稱為值類型。值類型變量聲明後,不管是否已經指派,編譯器為其配置設定記憶體。

2、引用類型(reference type):string 和 class統稱為引用類型。數組,接口也是引用類型。當聲明一個類時,隻在棧中配置設定一小片記憶體用于容納一個位址,而此時并沒有為其配置設定堆上的記憶體空間。當使用 new 建立一個類的執行個體時,配置設定堆上的空間,并把堆上空間的位址儲存到棧上配置設定的小片空間中。

C# 值類型與引用類型

3、範圍

C#的值類型包括:結構體(數值類型、bool型、使用者定義的結構體),枚舉,可空類型。

C#的引用類型包括:數組,使用者定義的類、接口、委托,object,字元串。

4、記憶體配置設定

數組的元素不管是引用類型還是值類型,都存儲在托管堆上。

引用類型在棧中存儲一個引用,其實際的存儲位置位于托管堆。而值類型總是配置設定在它聲明的地方:作為字段時,跟随其所屬的變量存儲;作為局部變量時,存儲在棧上。(棧的記憶體是自動釋放的,堆記憶體是.NET中會由GC來自動釋放)

5、适用場合

  • 引用類型可以派生出新的類型,而值類型不能,因為所有的值類型都是密封(seal)的;
  • 引用類型可以包含null值,值類型不能(可空類型功能允許将 null 賦給值類型,如   int? a = null;  );
  • 引用類型變量的指派隻複制對對象的引用,而不複制對象本身。而将一個值類型變量賦給另一個值類型變量時,将複制包含的值。