關於可空值型別

2022-02-15 04:42:45 字數 1418 閱讀 2711

有這樣乙個場景,在資料庫中經常有一些欄位是可以為空的,把資料庫中的字段對映成c#

中的乙個物件會出現一些問題,比如:乙個人的出生日期是乙個值型別

datetime,

在資料庫中是可以為空的乙個字段,當你使用

ado.net

把它對映成物件的時候,對

datetime

屬性賦值就變的比較困難了,如果資料庫中這個值是

null,

對映的物件要想準確的反映資料庫中的字段,那就必須給物件的

datetime

賦值為null,

但是值型別不能賦值為

null,

所以才有了可空值型別來解決這一問題。

引用型別是可以賦值為null

的。但值型別是不能賦值為

null

的。如果在值型別之後加乙個

?,那麼「普通的值型別」,就變成了乙個「可空值型別」,可空值型別不僅可以賦值乙個普通的值,也可以賦值乙個

null

。不能在引用型別後加 

? ,只能在值型別之後加  

? code:

int? n;

n = 

null;if

(n == 

null

)console

.readkey();

列印結果為:現在整形可以被賦值為空

我們很奇怪為什麼int ?型別就可以賦值為空呢,它到底是乙個什麼型別,我們通過反編譯工具可以看出原來它是nullable型別,但是nullable型別也是乙個值型別,為什麼可以賦值給null呢?

我們看到了反編譯工具裡的這句話:

沒錯,原來微軟把=

給重寫了

,所以我們可以給它賦值,上面的

n=null

其實就是執行的 

return value.value的值,

而 int ? n=9

就是呼叫的

implicit operator t?

這個方法 ,再呼叫nullable

的建構函式

這樣value

欄位裡就有值了,我們可以通過

value

屬性來訪問這個值,如果可空值型別被賦值為

null

,就不能呼叫上面的構造方法,通過

value

取值時就會報錯

,hasvalue

就是用來標記我們賦的值是空值還是乙個結構型別的值,如果是結構型別的值,就會呼叫構造方法,

hasvalue就會被賦值為

true

可空值型別

一 問題產生 在設計資料庫時,資料庫中的一列可能為null值,而這使我們在處理資料庫中的資料時將變得困難,因為clr沒有辦法將int型別表示成null值。二 解決辦法 1 在設計資料庫時,設定列的預設值,避免列存入空值 2 clr引入可空值型別 三 system.nullable結構定義的邏輯表示 ...

可空值型別

1 可空值型別 system.nullablewhere t struct 2 system.nullable與 int,double平級,為.net中的 一級公民 3 int32 nullable 4 nullable型別值與各種操作符進行運算,如果 nullable為null,則 結果為 nul...

可空值型別

c 中的可空值型別 c 不允許把null值賦給乙個值型別,以下語法是錯誤的 int i a null 但是,利用 c 定義的乙個修飾符,可將乙個變數宣告為乙個可空 nullable 值型別。可空值型別在行為上與普通值型別相似,但可以將乙個 null 值賦給它。如下所示 int?a null 合法 當...