c 值型別和引用型別《轉》

2022-08-01 15:57:14 字數 954 閱讀 9634

在c#中,

值型別:整型、布林型、字元型、實數型、結構型、列舉型。

引用型別

:類、物件、字串、陣列、介面、委託。

區別:1、值型別通常被分配在棧上,它的變數直接包含變數的例項,使用效率比較高。

2、引用型別分配在託管堆上,引用型別的變數通常包含乙個指向例項的指標,變數通過該指標來引用例項。

3、值型別繼承自valuetype(注意:而system.valuetype又繼承自system.object);而引用型別繼承自system.object。

4、值型別變數包含其實例資料,每個變數儲存了其本身的資料拷貝(副本),因此在預設情況下,值型別的引數傳遞不會影響引數本身;而引用型別變數儲存了其資料的引用位址,因此以引用方式進行引數傳遞時會影響到引數本身,因為兩個變數會引用了記憶體中的同一塊位址。

5、值型別有兩種表示:裝箱與拆箱;引用型別只有裝箱一種形式。我會在下節以專門的篇幅來深入討論這個話題。

6、典型的值型別為:struct,enum以及大量的內建值型別;而能稱為類的都可以說是引用型別。

7、值型別的記憶體不由gc(垃圾**,gabage collection)控制,作用域結束時,值型別會自行釋放,減少了託管堆的壓力,因此具有效能上的優勢。例如,通常struct比class更高效;而引用型別的記憶體**,由gc來完成,微軟甚至建議使用者最好不要自行釋放記憶體。

8、值型別是密封的(sealed),因此值型別不能作為其他任何型別的基類,但是可以單繼承或者多繼承介面;而引用型別一般都有繼承性。

9、值型別不具有多型性;而引用型別有多型性。

10、值型別變數不可為null值,值型別都會自行初始化為0值;而引用型別變數預設情況下,建立為null值,表示沒有指向任何託管堆的引用位址。對值為null的引用型別的任何操作,都會丟擲nullreferenceexception異常。

11、值型別有兩種狀態:裝箱和未裝箱,執行庫提供了所有值型別的已裝箱形式;而引用型別通常只有一種形式:裝箱。

C 值型別和引用型別

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

c 值型別和引用型別

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

C 值型別和引用型別

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