C 6 3 null 條件運算子

2021-09-20 04:39:23 字數 2761 閱讀 5638

c#6 新增特性目錄

1

namespace

csharp626

}78internal

class

program919

}20}21 }

在我們使用乙個物件的屬性的時候,有時候第一步需要做的事情是先判斷這個物件本身是不是bull,不然的話你可能會得到乙個 system.nullreferenceexception 的異常。雖然有時候我們可以使用三元運算子 string name = person != null ? person.name : null; 來簡化**,但是這種書寫方式還是不夠簡單......由於null值檢測時程式設計中非常常用的一種編碼行為,so,c#6為我們帶來了一種更為簡化的方式。

1

namespace

csharp626

}78internal

class

program915

}16 }

從上面我們可以看出,使用 ?. 這種方式可以代替if判斷和簡化三元運算子的使用,簡潔到不能再簡潔了吧。按照慣例,上兩份il**對比對比。

老版本的il**:

1

.method

private

hidebysig static void main() cil

managed

2 //

end of method program::main

if版的il

新語法的il:

1

.method

private

hidebysig static void main() cil

managed

2 //

end of method program::main

null條件運算子版的il

咦,貌似有很大不一樣,我們再來乙份三元運算子版的il看看:

1

.method

private

hidebysig static void main() cil

managed

2 //

end of method program::main

三元運算子版的il

新語法"?."和三元運算子"?:"的結果是唯一的差別是il_000a這一行。"?."的方式被編譯為call,而"?:"的方式被編譯為callvirt,不知為何"?:"中的persion.name為何會被編譯成支援多型方式呼叫的callvirt,在這種情況下貌似call效率會更高一些,但是終究"?."和"?:"編譯的**沒有本質差異。

但是和if判斷的相比簡化了一些,我們分析下il,看看有哪些差異(這裡就忽略call和callvirt的區別了):

if版的il分析:

1

.method

private

hidebysig static void main() cil

managed

2

null條件運算子版的il分析:

1

.method

private

hidebysig static void main() cil

managed

2

通過分析我們發現,null運算子編譯後的il**更簡短,使用了2個分支跳轉,簡化了判斷邏輯,而if版的il還多出來乙個bool型別的v_2臨時變數。

so,結論就是"?."的和三元運算子"?:"的編譯結果是一樣的,而且簡化了if的判斷。所以不管是從效能還是可讀性方面考慮,"?."都是推薦的寫法。

null條件運算子不但可以使用 ?. 的語法訪問物件的屬性和方法,還可以用 ?[ 的語法訪問檢測陣列或包含索引器的物件是否是null。比如:

1 person persons = null;2

//?.

3int? length = persons?.length;4//

?[5 person first = persons?[0];

上面的persions?.lenght返回的結果是nullable型別的,有時候我們可能需要的是乙個int型別的,那麼我們可以結合空連線運算子"??"一起使用,比如:

1 person persons = null;2

//?.和??結合使用

3int length = persons?.length ?? 0;

1 propertychangedeventhandler propertychanged =propertychanged;

2if (propertychanged != null)3

上面的**一直是我們呼叫事件的處理方式,把事件的引用放到乙個臨時變數中是為了防止在呼叫這個委託的時候,事件被取消註冊,產生null的情況。

我們從c#6以後終於可以用更簡單的方式去觸發事件呼叫了(這個埂自從c#1時代一直延續至今...):

1 propertychanged?.invoke(propertychanged(this, new propertychangedeventargs(nameof(name)));
null條件運算子是一種語法簡化,同時也會做一種編譯優化,優化方式和三元運算子的優化效果是一致的。語法更簡化了,效能也更好了,我們有什麼理由不用新語法呢。

c#-reference-operators:null-conditional operators

blackheart

出處:

C 6中NULL條件運算子

早期版本的c 更新介紹了可為 null 的型別和 null 合併運算子的概念,在處理可以為 null 值的值時減少樣本 量。c 6將繼續此主題,其中包含 null 條件運算子 當在表示式的右側的物件上使用時,如果物件不 null,則為 null 條件運算子將返回成員值,否則 null var ss ...

C 條件運算子

語法 condition first expression r second expression r 說明 當 condition 為 true 時,返回 first expression r,否則返回 second expression r。有些參考書上說 等價於如下語句 if conditio...

C 條件運算子

若在if語句中,當被判別的表示式的值為 真 或 假 時,都執行乙個賦值語句且給同乙個變數賦值時,可以用簡單的條件運算子來處理。例如,若有以下if語句 if a b max a else max b 可以用條件運算子 來處理 max a b a b 其中 a b a b 是乙個 條件表示式 它是這樣執...