shanzm 2019年8月23日 19:59:46 [TOC] 1. 可空類型修飾符(T?) 強類型語言中引用類型可以為空,如: 而你若是定義一個值類型為空,則是會報錯的。 然而,在處理資料庫和其他包含可能未賦值的元素的數據類型時,我們希望可以將 null 賦值給數值類型或布爾型的功能特別有用。例 ...
目錄
shanzm-2019年8月23日 19:59:461. 可空類型修飾符(T?)
強類型語言中引用類型可以為空,如:string str=null;
而你若是定義一個值類型為空,則是會報錯的。
然而,在處理資料庫和其他包含可能未賦值的元素的數據類型時,我們希望可以將 null 賦值給數值類型或布爾型的功能特別有用。例如,資料庫中的布爾型欄位可以存儲值 true 或 false,或者,該欄位也可以未定義
所以C# 提供了一個特殊的數據類型,Nullable
例如,Nullable< Int32 >,讀作"可空的 Int32",可以被賦值為 -2^31 到2^31-1 之間的任意值,也可以被賦值為 null 值。
類似的,Nullable< bool > 變數可以被賦值為 true 或 false 或 null。
實際上,Nullable類型是一個結構體,它有兩個公開可讀欄位:HasValue和Value。 HasValue是一個布爾值,當有值存儲時它為真,當變數值為null時HasValue為假。當HavValue為真是時,可以取得變數的值;為假時,當嘗試取得變數的值時會拋出一個異常(System.InvalidOperationException)。
聲明一個 nullable 類型(可空類型)的語法如下:
用可空類型修飾符"?"來表示,
表現形式為"T?"
例如:int? 表示可空的整形,DateTime? 表示可為空的時間。
T? 其實是System.Nullable(泛型結構)的縮寫形式,也就意味著當你用到T?時編譯器編譯 時會把T?編譯成System.Nullable的形式。
例如:int?,編譯後便是System.Nullable的形式。
2. 三元(運算符)表達式(?: )
例如:x?y:z 表示如果表達式x為true,則返回y;如果x為false,則返回z,是省略if{}else{}的簡單形式。
3. 空合併運算符(??)
為了減少可空類型的代碼量,遇到null的時候,C#提供了??
操作符來獲取如果為空的預設值
如果此運算符的左操作數不為null,則此運算符將返回左操作數,否則返回右操作數。
例如:a??b 當a為null時則返回b,a不為null時則返回a本身。
空合併運算符為右結合運算符,即操作時從右向左進行組合的。如,“a??b??c”的形式按“a??(b??c)”計算。
4. NULL檢查運算符(?.)
?.用於判斷某個對象是否為空,如果對象為NULL,則不進行後面的獲取成員的運算,直接返回NULL
例如:
class Foo
{
public int N { get; } = 1;
}
static void Main(string[] args)
{
Foo foo = null;
var n = 2 + foo?.N ?? 1
Console.WriteLine(n);
Console.ReadKey();//input :1
}
說明:
- +運算和??運算,是同級的,從左到右
- foo?N 其中foo為空,故foo?.N為空,而不是我們自己定義只讀屬性N的預設值1
- 2+null,註意結果是int?類型的,結果是null
- null??1,結果即1