小議C 中的可空值型別

2021-05-01 21:20:45 字數 817 閱讀 6068

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

為理解它們是如何工作的,先看看clr中的邏輯:

呼叫和輸出:

c#中允許使用問號來申明初始化變數(等同於上面**)如:

int32? x = 5;

int32? y = null;

總結一下c#對可空值型別對操作符的解釋:

a.一元操作符如果運算元為null,結果為null;

b.二元操作符中任何乙個為null,結果為null;

c.比較操作符如果兩人個運算元都為null,兩者相等;如果乙個為null,兩者不相等;如果兩個數都不為null,對值進行比較;

注意:在操作值型別時會生成大量**,**類似對基類(nullable)**的呼叫;

當clr對乙個nullable例項進行裝箱時,會檢查它是否為null,如果為null,clr不實際進行裝箱操作,並會返回null值;

如果例項不為空,將從型別中取出值,並對其進行裝箱如:

在應用可空值型別進行拆箱時,clr會分配記憶體(這是乙個極特殊的行為,在其它所有情況下,拆箱永遠不會導致記憶體的分配),原因在於乙個已裝箱的值型別不能簡單的拆箱為值型別的可空版本,在已裝箱的值型別中並不包含boolean hasvalue欄位,故在拆箱時clr必須分配乙個nullable物件,已初始化hasvalue = true ,value = 值型別值。這會對應用程式效能造成一定影響。

通過可空值型別呼叫介面方法

C 可空值型別

我們知道,值型別的變數永遠不會為null,但在資料庫中的乙個列可能允許值為空,但在clr中沒有辦法將int32值表示成null.為了解決這個問題,clr中引入了可空值型別,為了理解它是如何工作的,先來看看fcl中定義的system.nullable結構。一 可空值型別的 public struct ...

可空值型別

一 問題產生 在設計資料庫時,資料庫中的一列可能為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...