C 值型別和引用型別

2021-09-08 18:31:25 字數 2148 閱讀 8811

c#只有兩種資料型別:值型別和引用型別

值型別轉為引用型別稱成為裝箱,引用型別轉為值型別稱為拆箱

以下是值型別和引用型別對照表

從上圖可以簡單看出:string,object,陣列,class是引用型別,簡單型別,列舉,結構是值型別。

二、**展示

定義乙個類和結構呼叫賦值

記憶體分配情況如下圖:

從這張圖可以看出,class例項化出來的物件,指向了記憶體堆中分配的空間;truct例項化出來的物件,是在記憶體棧中分配。

修改**如下:

記憶體分配情況:

由上圖可以知:

object obj=」abc」;  

string i=(string)obj;

值型別和引用型別儲的位置不一樣

如果是引用型別,當兩個物件指向同乙個地方,修改某乙個的時候,其它物件的值會發生改變

注意點:

1、值型別變數做為區域性變數時,該例項將被建立在堆疊上;而如果值型別變數作為型別的成員變數時,它將作為型別例項資料的一部分,同該型別的其他欄位都儲存在託管堆上。

2、引用型別變數資料儲存在託管堆上,但是根據例項的大小有所區別:當例項的大小小於85000byte時例項將建立在gc堆上;當例項大小》=85000byte時,則該例項建立在loh(large object heap)堆上。

using

system;

namespace

}//值型別(因為『struct』)

public

struct

someval

}class

program}}

上的**

1、裝箱:就是將值型別的資料打包到引用型別的例項中(比如將int型別的值1賦給object物件obj)

int  i=1;  

object obj=(object)i;

裝箱時到底發生的事情:

1)、在託管堆中分配記憶體。分配的記憶體量是值型別各字段所需的記憶體量,還要加上託管堆所有物件都有的兩個額外成員(型別物件指標和同步塊索引)所需的記憶體量

2)、值型別的字段複製到新分配的堆記憶體

3)、返回物件位址,現在該位址是物件引用;值型別成了引用型別

2、拆箱:就是從引用資料中提取值型別(比如將object物件obj的值賦給int型別的變數i)

object obj=」1」;  

int i=(int)obj;

拆箱不是裝箱過程倒過來,拆箱的代價要比裝箱低的多,拆箱是獲取指標的過程,該指標指向包含在乙個物件中的原始值型別。

拆箱後將堆中的字段包含的值複製棧的值型別例項中。

3、值型別變為引用型別不一定要裝箱,例如:

string str = "

joye.net

" + 26; //

需要將26裝箱為string型別

string str1 = "

joye.net

" + 26.tostring(); //

tostring後不需要裝箱

感興趣的可以用il看一下。

《深入理解c#》第二版

《clr via c#》第四版

《c# 高階程式設計》第四版

還有很多網路上的文章,就不一一例舉了

C 值型別和引用型別

c 資料型別 值型別,引用型別 概念 值型別直接儲存其值,引用型別儲存對值的引用 這兩種型別儲存在記憶體的不同地方 值型別儲存在堆疊中,引用型別儲存在託管堆上。乙個引用型別的例子,如圖 上圖中,只有乙個user物件,u1和u2都指向包含該物件的記憶體位置 執行結果 在c 中,基本資料型別如bool和...

c 值型別和引用型別

今天我們來學習一下什麼是值型別和引用型別。1.值型別的值存在棧上,引用型別棧上存的是位址,值在堆上 2.將乙個值型別變數賦給另乙個值型別變數時,將複製包含的值。引用型別變數的賦值只複製對物件的引用,而不複製物件本身。3.裝箱是將值型別轉換為引用型別,拆箱是將引用型別轉換為值型別,利用裝箱和拆箱功能,...

C 值型別和引用型別

型別被分為兩種 值型別 整數,bool,struct 建構函式 char 字元 小數 引用型別 string 陣列 自定義的類,內建的類,物件.兩者在記憶體中的儲存方式 值型別 只需要一段單獨的記憶體,用於儲存實際的資料,單獨定義的時候放在棧中 引用型別 需要兩段記憶體 第一段儲存實際的資料,它總是...