空条件运算符和!=

通过在C#中引入Null-Conditional Operators ,进行以下评估,

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

如果我这样改写,

 if (instance?.Val != 0) 

如果instance是null引用,它将被计算为true ; 它表现得像

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

那么使用这种新语法重写评估的正确方法是什么?

编辑:

instance是从JSON反序列化的大对象的字段。 有很多这样的代码,首先检查字段是否在JSON中,如果是,检查Val属性是否不等于常量,只有两个条件都为真,做一些操作。

代码本身可以被重构,以使逻辑流程更加“有意义”,正如彼得在他的评论中指出的那样,尽管在这个问题中我对如何使用带有null-conditional operators感兴趣!=

使用Null-Conditional运算符返回值始终为null

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

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

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

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

您可以使用null coallescing运算符:

 instance?.Val ?? 0 

instance为null或instance不为null但Val ,上面的表达式将计算为0.否则将返回Val的值。

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

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