我們知道,值型別的變數永遠不會為null,但在資料庫中的乙個列可能允許值為空,但在clr中沒有辦法將int32值表示成null.
為了解決這個問題,clr中引入了可空值型別,為了理解它是如何工作的,先來看看fcl中定義的system.nullable結構。
一、可空值型別的**
publicstruct nullablewhere t : struct
public boolean hasvalue }
public
t value
return
value;}}
public
t getvalueordefault()
public
t getvalueordefault(t defaultvalue)
//過載equals方法
public
override
bool equals(object
obj)
//過載tostring()方法
public
override
string
tostring()
public
static
implicit
operator nullable(t value)
public
static
explicit
operator t(nullablevalue)
}
可以看出,可空型別是乙個結構型別,也就是說本身是乙個值型別,例項仍然是在棧上,nullable的型別引數被約束為struct,也就是說這個型別是為了值型別而設定的。
二、可空值型別的使用
我們要在**中使用乙個可空的int32,就可以像下面這樣寫:
nullablex = 5; nullable
x = null;
但是在c#中一般是這樣寫
int? x = 5;int? x = null;
三、合併操作符
c# 提供了乙個空接合操作符,即??操作符,假如左邊的不為null,就返回這個運算元,如果左邊的為null,就返回右邊的運算元。
下面兩行**是等價的
int? b = null;int a = (b.hasvalue) ? b.value : 123
;int a = b ?? 123;
四、可空型別的裝箱和拆箱
裝箱:當clr對可空型別進行裝箱時,會檢查它是否為null,如果是,clr不裝箱任何東西,直接返回null,如果可空例項不為null,clr從可空例項中取出值並進行裝箱,也就是說,值為5的可空型別會裝箱成值為5的已裝箱int32.
拆箱:如果已裝箱的值型別引用的是null,要把它拆箱成可空型別,那麼clr會將可空型別的值設為null.
五、可空型別呼叫gettype
在可空型別上呼叫gettype,實際會撒謊說型別是t,而不是nullable。也就是說 int32? x=5 ;在執行 x.gettype()時,會顯示system.int32, 而不是system.nullable;
可空值型別
一 問題產生 在設計資料庫時,資料庫中的一列可能為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 合法 當...