web-dev-qa-db-ja.com

ヌル条件演算子および!=

C#で Null-Conditional Operators を導入すると、次の評価のために、

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

このように書き換えると、

if (instance?.Val != 0)  

インスタンスがnull参照の場合、trueと評価されます。のように振る舞います

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

では、この新しい構文を使用して評価を書き換える正しい方法は何ですか?

編集:

instanceは、JSONから逆シリアル化されたビッグオブジェクトのフィールドです。このようなコードにはかなりの数があります。最初にフィールドがJSONにあるかどうかを確認し、JSONにある場合は、Valプロパティが定数に等しくないかどうかを確認します。

コード自体をリファクタリングして、Peterのコメントで示されているように論理フローをより「意味のある」ものにすることができますが、この質問ではnull-conditional operators with !=

16
kennyzx

Null-Conditional演算子を使用すると、戻り値は常にnullになります

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

インスタンスがnullの場合、instance?.Valもnull(おそらくint?)になります。したがって、何かと比較する前に、常にヌルをチェックする必要があります。

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

つまり、instance?.Valがnullの場合(インスタンスがnullであるため)、0を返します。それ以外の場合は、instance.Valを返します。次に、この値を0(等しくない)と比較します。

10

ヌル合体演算子を使用できます:

instance?.Val ?? 0

instanceがnullまたはinstanceがnullではないがValがnullの場合、上記の式は0と評価されます。それ以外の場合は、Valの値が返されます。

7
Christos
if ((instance?.Val).GetValueOrDefault() != 0)  

?条件演算子は、.Valプロパティを自動的にNullableとして扱います。

2
Steve Py