空条件运算符 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(不等于)进行比较。
随着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(不等于)进行比较。