W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
引用類型可以使用空引用表示不存在的值。
值類型通常不能表示空值。
例如:
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
。
從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
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)算符的類別不同地處理空邏輯。
這意味著兩個(gè)空值是相等的:
Console.WriteLine ( null == null); // True
Console.WriteLine ((bool?)null == (bool?)null); // True
如果恰好一個(gè)操作數(shù)為空,則操作數(shù)不等。
如果兩個(gè)操作數(shù)都不為空,則比較它們的值。
將 null
值與空值或非空值進(jìn)行比較返回false。
所有其他運(yùn)算符(+, - ,*,/,%,&,|,^,<<,>>,+,++, - ,!,?)在任何操作數(shù)為空時(shí)返回null。
您可以混合和匹配可空類型和非可空類型:
int? a = null;
int b = 1;
int? c = a + b; // c is null - equivalent to a + (int?)b
當(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)算符,它可以與可空類型和引用類型一起使用。
如果操作數(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
值。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: