C 中值型別和引用型別的區別淺記

2021-06-22 16:59:28 字數 1718 閱讀 4823

在c#中,變數的型別分為兩種,分別是值型別和引用型別。

值型別的變數直接儲存值,說得更具體一些,就是值型別變數在記憶體中直接儲存它們自身的值,如**所示,

int 

x = 2;

值型別變數x,在記憶體中的某處直接儲存了它自身的值:2。

引用型別的變數儲存的是對其物件的引用,更進一步說,就是引用型別變數在記憶體中直接儲存了乙個指向它處的引用,而引用所指的物件則儲存在引用型別變數所指的記憶體中。如**所示,

public 

class 

thing

thing  x  =   new

thing();

引用型別變數x,在對它進行宣告時,會在記憶體中的某處分配一塊空間儲存它自身的內容,而我們所使用的變數x,實際上則是乙個指向了它自身內容的引用。

注意,稍後我們會說到,引用型別的變數,它自身的內容總是儲存在堆中;而值型別的變數,它自身的值總是分配在宣告它的地方(可能在棧中,也可能在堆中)。

那麼,c#中的值型別與引用型別,都有哪些區別呢,讓我們來列舉一下。

1、因為值型別變數儲存的就是它自身的值,所以它總是包含乙個值,不能為空;而引用型別變數儲存的是乙個指向它處的引用,所以可以為空(null),表示不包含值,即沒有指向記憶體中的任何地方。

2、引用型別直接繼承自system.object類,與此不同,值型別直接繼承自system.valuetype類,而system.valuetype類直接繼承自system.object類。作為所有型別的基類,system.object類提供了一組方法,這些方法在所有型別中都能找到,如tostring方法等。system.valuetype類繼承了system.object類,它並沒有新增任何新成員,而只是覆蓋了所繼承的一些方法,使其更適合於值型別。注意,我們可以使用type.isvaluetype屬性來判斷乙個型別是否為值型別,如**所示

thing x = new 

thing();

if( x.gettype().isvaluetype )

3、引用型別物件和值型別物件,它們在記憶體中的儲存分配規則不同。引用型別物件總是分配在堆中;而值型別物件總是分配在它被宣告的地方:若值型別物件作為欄位被宣告,那麼它將跟隨其所屬的物件被分配;若值型別物件作為區域性變數被宣告,那麼它將儲存在棧上。如**所示,

public 

class 

thing

thing x = new 

thing();

int x = 2;// x

作為區域性變數,

x為值型別,位於棧上

4、所有的值型別都是密封的(seal),無法派生出新型別,而引用型別則可以繼續派生。這也是值型別更適合於資料儲存,而引用型別更適合於定義行為的原因。

最後,把c#中值型別與引用型別的劃分全部列舉一下:

作為值型別的資料型別

bool  byte   char              decimal        double          float  int   long     short      sbyte     uint        ulong     ushort enum     struct

作為引用型別的資料型別

class      object    string     inte***ce              delegate

好了,關於c#中值型別與引用型別的區別暫時就記錄這麼多,後續若有補充還會繼續完善。

C 中值型別和引用型別的區別

概念 1.值型別 資料儲存在記憶體的堆疊中,從堆疊中可以快速地訪問這些資料,因此,值型別表示實際的資料。2.引用型別 表示指向儲存在記憶體堆中的資料的指標或引用 包括類 介面 陣列和字串 區別 基本區別在於它們在記憶體中的儲存方式。值型別只將值存放在記憶體中,這些值型別都儲存在堆疊中。原始資料型別 ...

C 中值型別和引用型別的區別

概念 1.值型別 資料儲存在記憶體的堆疊中,從堆疊中可以快速地訪問這些資料,因此,值型別表示實際的資料。2.引用型別 表示指向儲存在記憶體堆中的資料的指標或引用 包括類 介面 陣列和字串 區別 基本區別在於它們在記憶體中的儲存方式。值型別只將值存放在記憶體中,這些值型別都儲存在堆疊中。原始資料型別 ...

理解C 中值型別和引用型別的區別

概念 1.值型別 資料儲存在記憶體的堆疊中,從堆疊中可以快速地訪問這些資料,因此,值型別表示實際的資料。2.引用型別 表示指向儲存在記憶體堆中的資料的指標或引用 包括類 介面 陣列和字串 區別 基本區別在於它們在記憶體中的儲存方式。值型別只將值存放在記憶體中,這些值型別都儲存在堆疊中。原始資料型別 ...