學習筆記2 詭異的可空值型別裝箱拆箱

2021-09-06 11:55:51 字數 1462 閱讀 6349

public

virtual

bool tryparseint32(bool nullable, string str, out

object

value)

else

}

看上去沒什麼問題吧,但是在一次偶然的測試中發現:無論nullable為false還是true返回的都是int我就奇怪了,這麼簡單的邏輯我也會寫錯???

在進過了一次單步除錯後終於發現了乙個現象:可空值型別int?裝箱後就變成int了!!

首先用is判斷 居然都是true.....

typeof(nullable) == i.gettype()  這個居然是false

再看i.gettype().fullname = int

好吧看看il中都發生了什麼

因為gettype()是父類object的方法,值型別在執行object方法的時候會將本身物件裝箱之後再callvirt

ps:引用型別class沒有這個裝箱的問題,甚至都不需要轉換就可以執行方法,原因應該就是他們乙個在堆乙個在棧的問題吧

但是可空值型別一旦裝箱就會變成他的基礎型別,所以就會出現上面的現象

關於這點,我檢視msdn裡面有說明

在對可以為 null 的型別進行裝箱時,公共語言執行時自動將 nullable

物件的基礎值(而不是 nullable

物件本身)裝箱。

也就是說,如果 hasvalue 屬性為 true,則將 value 屬性的內容裝箱。

在對可以為 null 的型別的基礎值進行取消裝箱時,公共語言執行時建立乙個新的初始化為基礎值的 nullable

結構。如果可以為 null 的型別的 hasvalue 屬性為 false,則裝箱操作的結果為 null

。因此,如果將已裝箱的可以為 null 的型別傳遞給需要物件引數的方法,則該方法必須準備處理引數為 null

的情況。

如果對 null

進行取消裝箱使其成為可以為 null 的型別,則公共語言執行時會建立乙個新的 nullable

結構並將其 hasvalue 屬性初始化為false。

關於上面這句話,我的理解就是,這些都是公共語言執行時做的。

我們自己寫的類或者結構是沒有辦法達到這個效果的。

這個東西以前一直沒有發現,如果早點知道是這樣就不會出現昨天學習筆記1中的內容了

昨天修改後的**就值這樣了

public

virtual

bool tryparseint32(string str, out

object

value)

else

}

小議C 中的可空值型別

通常乙個值型別變數永遠不可能為null,它總是包含值型別的值本身。但是在某些情況下會遇到一些問題如 在對映資料庫中的乙個可空值列時,使用framework來處理資料庫資料時變得相當困難 為了解決這一問題clr中引入了 可空值型別 nullable value type 為理解它們是如何工作的,先看看...

golang的可空型別和零值

可空型別可以置為nil 在go裡面,基本型別都是不可空型別 var a int nil var a int default value of int,cannot be nil fmt.println a 0 0 types zero value int,int8,int16,int32,int64...

Redis學習筆記(2) string 型別值訪問

在redis學習筆記 1 中,我們提到redis是屬於key value儲存結構,value儲存的型別有string 字串 list 鍊錶 set 集合 和zset 有序集合 在接下去的學習中,我們將學習value值的儲存。那麼我們先學習比較簡單的儲存型別 string型。說明 由於採用的平台是.n...