空条件运算符 and !=

Null-conditional operator and !=

随着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属性是否不等于常量,只有两个条件都为真, 做一些操作。

代码本身可以重构,使逻辑流程更多 "making sense" 正如彼得在他的评论中指出的那样,尽管在这个问题中我对如何使用 null-conditional operators 和 [=15] 很感兴趣=].

您可以使用空合并运算符:

instance?.Val ?? 0

instance 为空或 instance 不为空但 Val 为空时,上述表达式的计算结果为 0。否则将返回 Val 的值.

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

那个?条件运算符会自动将 .Val 属性 视为 Nullable.

使用 Null 条件运算符 returned 值始终可以为 null

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

如果 instance 为 null,则 instance?.Val 也将为 null(在您的情况下可能为 int?)。所以你应该在与任何东西比较之前总是检查空值:

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

这意味着: 如果 instance?.Val 为 null(因为 instance 为 null)则 return 0。否则 return instance.Val。接下来将此值与 0(不等于)进行比较。