1. 程式人生 > >C#中?的相關使用

C#中?的相關使用

C#中?的相關使用

今天看了幾篇部落格,學習了一下與?相關的使用,大致分為一下幾種:

1. 可空型別

看標題就能夠很好的理解這個概念:可以為空的型別。而在C#中可以為空也就是null的型別,都是引用型別,所以?對於引用型別來說,也就沒有什麼存在的價值了,只能服務於值型別,使得在某些不確定的情況下,值型別擁有更好的適應能力。也就是說,值型別也可以接受null,當然是在使用?的前提下。使用如下,在值型別後新增?即可:

  int? a = null;
 a = 10;

可以看的出,宣告為可空型別的變數,既可以接收null也可以接收正常的值型別。

2. 可空運算子

使用可空運算子這個詞可能不是特別的合適,但一時詞窮,將就用了。其實就是?.?[]罷了。分別用於物件對成員的呼叫以及陣列的索引。物件為空或者陣列為空,這種情況還是挺常見的。如果按照平時的寫法大致就是。。。

  if(object != null){//方法呼叫
     object.method();
}
 if(array != null){ //陣列索引
     int a = array[1];
}

但是現在有了可空運算子之後,能省的就都省了,簡潔到飛起來,一句程式碼搞定。

  object?.method();
 array?[1];

而且這樣的寫法更加的容易理解,在執行方法的呼叫或者素組的索引之前,進行null的判斷,如果為null,則後續的操作打斷,返回null;不為null,則繼續執行。這樣的效率相比較if判斷也要更高一下。

3. 三元運算子 condition?(true result):(false result)

這個再熟悉不過了,但是之前一直沒有和這些歸為一類來考慮,只是機械化的使用。不同的是,三元運算子的condition必須為bool型別,為true時,返回true result;false時,返回false result。需要注意的應該就是返回的值一定要和定義型別匹配才行。

4. 空合併運算子 ??

有些情況下,獲取的值可能出現null,但獲取的null對於後續的程式來說無法使用。好的處理方法,應該就是判斷一下獲取的值是否為null,為null,那麼就賦一個值;不為null,就直接使用獲取的值,這樣是比較合理的操作。這裡使用三元運算子是完全可以進行解決的,如下:

  int oneNum = object.num !=null? object.num : 0;

這樣獲取到oneNum永遠都不會為null,對於後續的程式碼而言,也是相對有好的。雖然三元運算子可以解決,但更簡潔的解決方案是使用??:

  int oneNum = object.num ?? 0;

當object.num不為null時,返回object.num;object.num為null,則返回0。相比較三元運算子而言,更加的簡潔,理解性也高了不少。但是上面的使用存在一個問題,如果object為null呢?這裡就可以使用可空運算子來判斷,如下:

  int oneNum = object?.num ?? 0;

這樣就保證了在ojbect為null的情況下,也不會出錯了。

總結

null在很多情況下,對於程式而言都是不友好的,我們也極力地避免null的出現。相比較使用各種判斷語句而言,?的出現無疑讓程式碼精簡了不少,理解性也提高了很多。而且它們之間的巢狀使用(像最後一個例子)在複雜的判斷中優勢更加的明顯。