2017-06-28 177 views
11

在C#中引入Null-Conditional Operators,爲下面的評測,空,條件運算符和!=

if (instance != null && instance.Val != 0) 

如果我把它改寫這種方式,

if (instance?.Val != 0) 

將進行評估,以如果實例是空引用,則返回true;它的行爲如同

if (instance == null || instance.Val != 0) 

那麼,使用這種新語法重寫評估的正確方法是什麼?

編輯:

instance是從JSON反序列化大對象的字段。這樣的代碼有很多,首先檢查字段是否在JSON中,如果是,檢查Val屬性是否不等於常量,只有兩個條件都是真的,執行一些操作。

代碼本身可以被重構,以使得邏輯流程更加「有意義」,如Peter在他的評論中所表明的,儘管在這個問題中我對如何使用null-conditional operators!=感興趣。

+2

我會試試像'if((instance?.Val ?? 0)!= 0)' – john

+1

其實,它的行爲就像'instance?.Val!= 0',短路的'null'不可能等於'0',整個表達式爲'true'。坦率地說,沒有足夠的背景知道什麼 - 「正確的方式」來解決這個問題。對我來說,「null」值和零值都導致相同的代碼執行塊似乎很奇怪。鑑於你處於這種情況,可能有更好的方法來處理這種情況。或者,也許,只是不要試圖在這裏使用空值條件,因爲它所要做的就是使代碼無法讀取。 –

+1

我創建了一個問題的[fiddle](https://dotnetfiddle.net/kf96px)。彼得,它似乎是一種防範措施,除非Val具有非零/非空值,如果您創建類似於PATCH API方法的東西,對我來說這似乎不對。 – john

回答

6

隨着空,條件運算符返回的值總是可以爲空

if ((instance?.Val ?? 0) != 0) 

如果實例爲null,則實例?.VAL也將是無效的(大概詮釋?你的情況)。所以,你總是應該與任何比較之前檢查空值:

if ((instance?.Val ?? 0) != 0) 

這意味着: 如果實例.VAL是空的(因爲實例爲null),則返回0,否則返回instance.Val?接下來比較這個值與0(不等於)。

7

你可以利用空coallescing運營商:

instance?.Val ?? 0 

instance爲空或instance不爲空,但Val是,上述表達式將評估爲0,否則的Val值將被退回。

2
if ((instance?.Val).GetValueOrDefault() != 0) 

的?條件運算符會自動將.Val屬性視爲可空。

+0

是的,'(instance?.Val).GetValueOrDefault()'將在編譯後與'(instance?.Val ?? 0)'相同,其中'0'是編譯時常量,也被稱爲'default (INT)'。 –