C# ?? 和 ?: 運算符

?:條件運算符  根據 Boolean 表達式的值返回兩個值之一。 

下面是條件運算符的語法。

condition ? first_expression : second_expression;

condition 的計算結果必須爲 true 或 false。 如果 condition 爲 true,則將計算 first_expression 並使其成爲結果。 如果 condition 爲 false,則將計算 second_expression 並使其成爲結果。 只計算兩個表達式之一。
first_expression 和 second_expression 的類型必須相同,或者必須存在從一種類型到另一種類型的隱式轉換。

條件運算符爲右聯運算符。 表達式 a ? b : c ? d : e 作爲 a ? b : (c ? d : e) 而非 (a ? b : c) ? d : e 進行計算。

無法重載條件運算符。

int a = 6;
int b = 6;
bool isSame = a == b ? true : false;

isSame 的結果爲true;


?? 運算符稱作 null 合併運算符。如果此運算符的左操作數不爲 null,則此運算符將返回左操作數;否則返回右操作數。

可以爲 null 的類型可以表示類型的域中的值,或者值可以是未定義的(在這種情況下,值爲 null)。 當左操作數具有一個值爲 null 的可以爲 null 的類型時,可以使用 ?? 運算符的語法表現力來返回適當的值(右操作數)。 如果在嘗試將可以爲 null 值的類型分配給不可以爲 null 值的類型時沒有使用 ?? 運算符,則會生成編譯時錯誤。 如果使用強制轉換,且當前未定義可以爲 null 值的類型,則會引發 InvalidOperationException 異常。

class NullCoalesce
{
    static int? GetNullableInt()
    {
        return null;
    }

    static string GetStringValue()
    {
        return null;
    }

    static void Main()
    {
        int? x = null;

        // Set y to the value of x if x is NOT null; otherwise, 
        // if x = null, set y to -1. 
        int y = x ?? -1;

        // Assign i to return value of the method if the method's result 
        // is NOT null; otherwise, if the result is null, set i to the 
        // default value of int. 
        int i = GetNullableInt() ?? default(int);

        string s = GetStringValue();
        // Display the value of s if s is NOT null; otherwise,  
        // display the string "Unspecified".
        Console.WriteLine(s ?? "Unspecified");
    }
}

可以爲 null 的類型具有以下特性:

.可以爲 null 的類型表示可被賦值爲 null 值的值類型變量。 無法創建基於引用類型的可以爲 null 的類型。 (引用類型已支持 null 值。)
.語法 T? 是 Nullable 的簡寫,此處的 T 爲值類型。 這兩種形式可以互換。
.爲可以爲 null 的類型賦值的方法與爲一般值類型賦值的方法相同,如 int? x = 10; 或 double? d = 4.108。 對於可以爲 null 的類型,也可向其賦 null: int? x = null. 值
.如果基礎類型的值爲 null,請使用 Nullable.GetValueOrDefault 方法返回該基礎類型所賦的值或默認值,例如 int j = x.GetValueOrDefault();
.將 HasValue 和 Value 只讀屬性用於測試是否爲空和檢索值,如下面的示例所示:if(x.HasValue) j = x.Value;
   .如果此變量包含值,則 HasValue 屬性返回 true;或者如果是 null 則返回 false。
   .如果已賦值,則 Value 屬性返回該值。 否則,將引發 InvalidOperationException。
   .HasValue 的默認值爲 false。 Value 屬性沒有默認值。
   .還可以將 == 和 != 操作數用於可爲 null 的類型,如下面的示例所示:if (x != null) y = x;
.使用 ?? 算符分配默認值,在將當前值爲 null 的可以爲 null 的類型賦值給不可以爲 null 的類型時,將應用該默認值,如 int? x = null; int y = x ?? -1;
.不允許使用嵌套的可以爲 null 的類型。 將不編譯下面一行:Nullable<Nullable<int>> n;


Nullable<T> 結構支持

.對於一個類型,如果既可以給它分配一個值,也可以給它分配 null(表示沒有任何值),我們就說這個類型是可空的。 默認情況下,所有引用類型,如 String,可以爲空,但是,所有值類型,例如 Int32,不能爲空。
.在 C# 和 Visual Basic 中,可以通過使用 ? 表示方法在值類型之後標記一個值類型爲空。 例如,int? 在 C# 中或 Integer? 在Visual Basic 中聲明瞭可分配 null的整數值類型。
.Nullable<T> 結構支持只將一個值類型用作可以爲 null 的類型,因爲引用類型本身就是可空的。
.Nullable 類爲 Nullable<T> 結構提供補充支持。 Nullable 類支持獲取可以爲 null 的類型的基礎類型,對於其基礎值類型不支持泛型比較和相等比較運算的可以爲 null 的類型,該類支持對其進行比較和相等比較運算


參考:https://msdn.microsoft.com/zh-cn/library/6a71f45d

發佈了37 篇原創文章 · 獲贊 16 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章