空条件运算符和!=
通过在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。