C 引用型別和值型別

2022-05-11 16:51:09 字數 973 閱讀 4394

clr支援兩種型別:引用型別和值型別。

1.引用型別

(1)記憶體必須從託管堆上分配;

(2)堆上分配的每個物件都有一些額外成員(包括「型別物件指標」,「同步塊索引」),這些成員必須初始化;

(3)物件的其他位元組總是設為零;

(4)從託管堆分配物件時,可能強制執行一次垃圾**。

2.值型別

(2)不受垃圾**器控制;

3.兩者的區別

(1)值型別的兩種表示形式:未裝箱和已裝箱,引用型別都是已裝箱;

(2)值型別從system.valuetype派生,提供了與system.object相同的方法,但是重寫了equals和gethashcode方法;

(3)由於值型別不能作為基型別,所以不應在值型別中使用虛方法;

(4)引用型別包含堆中物件的位址,預設為null;

(5)將值型別變數賦值給另外乙個值型別變數,會複製每個欄位的值,而引用型別則只複製記憶體位址,所以改變值型別的複製物件不會影響原值,但是引用型別會改變原值;

(6)由於未封裝的值型別不在堆上分配,如果分配後該型別的事例不再活動,其記憶體就會被釋放。

4.裝箱

定義:將值型別轉換成引用型別。

(1):在堆記憶體中分配值型別各字段所需的記憶體加上額外成員(型別物件指標和同步塊索引)所需的記憶體;

(2):值型別的字段複製到新分配的對記憶體;

5.拆箱

定義:將引用型別轉換為值型別。

(1):獲取已裝箱事例的各字段值;

(2):將字段包含的值從堆複製到棧的值型別。

注意:(1):如果已裝箱事例的引用為null,丟擲nullreferenceexception異常;

(2):如果引用的物件不是所需值型別的已裝箱例項,丟擲invalidcastexception異常。

例如:

1

public

static

void

main()

2

C 值型別和引用型別

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

c 值型別和引用型別

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

C 值型別和引用型別

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