有這樣乙個場景,在資料庫中經常有一些欄位是可以為空的,把資料庫中的字段對映成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 合法 當...