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 = "感興趣的可以用il看一下。joye.net
" + 26; //
需要將26裝箱為string型別
string str1 = "
joye.net
" + 26.tostring(); //
tostring後不需要裝箱
《深入理解c#》第二版
《clr via c#》第四版
《c# 高階程式設計》第四版
還有很多網路上的文章,就不一一例舉了
C 值型別和引用型別
c 資料型別 值型別,引用型別 概念 值型別直接儲存其值,引用型別儲存對值的引用 這兩種型別儲存在記憶體的不同地方 值型別儲存在堆疊中,引用型別儲存在託管堆上。乙個引用型別的例子,如圖 上圖中,只有乙個user物件,u1和u2都指向包含該物件的記憶體位置 執行結果 在c 中,基本資料型別如bool和...
c 值型別和引用型別
今天我們來學習一下什麼是值型別和引用型別。1.值型別的值存在棧上,引用型別棧上存的是位址,值在堆上 2.將乙個值型別變數賦給另乙個值型別變數時,將複製包含的值。引用型別變數的賦值只複製對物件的引用,而不複製物件本身。3.裝箱是將值型別轉換為引用型別,拆箱是將引用型別轉換為值型別,利用裝箱和拆箱功能,...
C 值型別和引用型別
型別被分為兩種 值型別 整數,bool,struct 建構函式 char 字元 小數 引用型別 string 陣列 自定義的類,內建的類,物件.兩者在記憶體中的儲存方式 值型別 只需要一段單獨的記憶體,用於儲存實際的資料,單獨定義的時候放在棧中 引用型別 需要兩段記憶體 第一段儲存實際的資料,它總是...