C# 可空類型

2018-01-22 17:10 更新

C# 可空類型

引用類型可以使用空引用表示不存在的值。

值類型通常不能表示空值。

例如:

string s = null; // OK, Reference Type
int i = null;    // Compile Error, Value Type cannot be null

要在值類型中表示 null ,必須使用一個(gè)稱為可空類型的特殊結(jié)構(gòu)。

可空類型用值類型表示,后跟?符號(hào):

int? i = null; // OK, Nullable Type
Console.WriteLine (i == null); // True

Nullable< T> 是不可變結(jié)構(gòu),只有兩個(gè)字段,代表 Value HasValue 。


隱式和顯式可空轉(zhuǎn)換

從T到T的轉(zhuǎn)換?是隱式的,并且從T?到T是顯式的。

例如:

int? x = 5; // implicit
int y = (int)x; // explicit

顯式轉(zhuǎn)換直接等同于調(diào)用可為空的對(duì)象的Value屬性。

因此,如果 HasValue 為false,則拋出 InvalidOperationException 。

裝箱和拆箱可空值

當(dāng) T?被裝箱時(shí),堆上的裝箱值包含 T ,而不是 T?。

這個(gè)優(yōu)化是可能的,因?yàn)檠b箱的值是可以表達(dá)null的引用類型。

C#還允許使用as操作符取消裝箱可空類型。如果轉(zhuǎn)換失敗,結(jié)果將為null:

object o = "string";
int? x = o as int?;
Console.WriteLine (x.HasValue); // False

運(yùn)算符優(yōu)化

Nullable <T> struct不定義操作符,例如<,>,甚至==。盡管如此,下面的代碼編譯并正確執(zhí)行:

int? x = 5;
int? y = 10;
bool b = x < y; // true

如果 x y 都有值,則通過int的小于運(yùn)算符進(jìn)行比較;否則,返回false。

運(yùn)算符提升意味著你可以在 T 上隱式使用T的運(yùn)算符。

這里有些例子:


int? x = 1;
int? y = null;

// Equality operator examples
Console.WriteLine (x == y); // False
Console.WriteLine (x == null); // False
Console.WriteLine (x == 1); // True
Console.WriteLine (y == null); // True
Console.WriteLine (y == 1); // False
Console.WriteLine (y != 1); // True


// Relational operator examples
Console.WriteLine (x < 6); // True
Console.WriteLine (y < 6); // False
Console.WriteLine (y > 6); // False


// All other operator examples
Console.WriteLine (x + 5); // 6
Console.WriteLine (x + y); // null

編譯器根據(jù)運(yùn)算符的類別不同地處理空邏輯。

等式運(yùn)算符(==和!=)

這意味著兩個(gè)空值是相等的:


Console.WriteLine ( null == null); // True
Console.WriteLine ((bool?)null == (bool?)null); // True

如果恰好一個(gè)操作數(shù)為空,則操作數(shù)不等。

如果兩個(gè)操作數(shù)都不為空,則比較它們的值。

關(guān)系運(yùn)算符

null 值與空值或非空值進(jìn)行比較返回false。

所有其他運(yùn)算符(+, - ,*,/,%,&,|,^,<<,>>,+,++, - ,!,?)在任何操作數(shù)為空時(shí)返回null。

混合可空和不可為空的運(yùn)算符

您可以混合和匹配可空類型和非可空類型:


int? a = null;
int b = 1;
int? c = a + b; // c is null - equivalent to a + (int?)b

bool? 用 & 和 | 運(yùn)算符

當(dāng)提供的bool?類型的操作數(shù)&|運(yùn)算符將null視為未知值。所以,null | true為true。

類似地, null & false為false。

以下示例枚舉其他組合:


bool? n = null;
bool? f = false;
bool? t = true;
Console.WriteLine (n | n); // (null)
Console.WriteLine (n | f); // (null)
Console.WriteLine (n | t); // True
Console.WriteLine (n & n); // (null)
Console.WriteLine (n & f); // False
Console.WriteLine (n & t); // (null)

空合并運(yùn)算符

?? 運(yùn)算符是空合并運(yùn)算符,它可以與可空類型和引用類型一起使用。

如果操作數(shù)是非空的,返回它;否則,或返回默認(rèn)值。

例如:


int? x = null;
int y = x ?? 5; // y is 5

int? a = null, b = 1, c = 2;
Console.WriteLine (a ?? b ?? c); // 1 (first non-null value)

?? 運(yùn)算符等效于調(diào)用具有顯式默認(rèn)值的 GetValueOrDefault 值。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)