在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
与!=
一起使用感兴趣。
答案 0 :(得分:10)
使用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(不等于)进行比较。
答案 1 :(得分:7)
你可以使用null coallescing operator:
instance?.Val ?? 0
当instance
为空或instance
不为空但Val
为时,上述表达式将计算为0.否则将返回Val
的值。< / p>
答案 2 :(得分:2)
if ((instance?.Val).GetValueOrDefault() != 0)
?条件运算符会自动将.Val属性视为Nullable。