簡要分析了值型別和引用型別的區別。

2022-03-22 06:45:25 字數 1091 閱讀 4970

宣告乙個值型別變數,編譯器會在棧上分配乙個空間,這個空間對應著該值型別變數,空間裡儲存的就是該變數的值。引用型別的例項分配在堆上,新建乙個引用型別例項,得到的變數值對應的是該例項的記憶體分配位址,這就像您的銀行賬號一樣。具體哪些型別是值型別哪些是引用型別,大家翻翻書,背一背就好了,不過它們有什麼區別呢?

區別:

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 是一種型別安全的語言。每乙個變數都要求定義為乙個特定的型別,並且要求儲存在變數中的值只能是這種型別的值。變數既能儲存值型別,也可以儲存引用型別,還可以是指標。這一課將講述前兩種型別,關於指標的討論我們將在下一課中進行。下面是關於值型別和引用型別不同點的概論 如果乙個變數v儲存的是值型別,則它直接...

引用型別和值型別

c 中值型別和引用型別作為方法引數傳遞的時候其實都可以說是 值 的傳遞,只不過這裡的 值 指代的東西有所區別。當方法的引數為值型別時,方法傳遞的是值本身的值。當方法的引數為引用型別時,方法傳遞的則是應用型別的引用的位址,也就是引用型別位址在棧上的值。舉個引用型別作為引數傳遞的例子 static vo...

值型別和引用型別

為了更好地說明兩種型別之間的區別,借用如下的 來說明 值型別引用型別 記憶體分配地點 分配在棧中 分配在堆中 效率效率高,不需要位址轉換 效率低,需要進行位址轉換 記憶體 使用完後,立即 使用完後,不是立即 等待gc 賦值操作 進行複製,建立乙個同值新物件 只是對原有物件的引用 函式引數與返回值 是...