C 可空值型別

2022-06-06 09:51:14 字數 1684 閱讀 7152

我們知道,值型別的變數永遠不會為null,但在資料庫中的乙個列可能允許值為空,但在clr中沒有辦法將int32值表示成null.

為了解決這個問題,clr中引入了可空值型別,為了理解它是如何工作的,先來看看fcl中定義的system.nullable結構。

一、可空值型別的**

public

struct 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 合法 當...