2017-06-28 136 views
11

在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属性是否不等于常量,只有两个条件都是真的,执行一些操作。

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

+2

我会试试像'if((instance?.Val ?? 0)!= 0)' – john

+1

其实,它的行为就像'instance?.Val!= 0',短路的'null'不可能等于'0',整个表达式为'true'。坦率地说,没有足够的背景知道什么 - “正确的方式”来解决这个问题。对我来说,“null”值和零值都导致相同的代码执行块似乎很奇怪。鉴于你处于这种情况,可能有更好的方法来处理这种情况。或者,也许,只是不要试图在这里使用空值条件,因为它所要做的就是使代码无法读取。 –

+1

我创建了一个问题的[fiddle](https://dotnetfiddle.net/kf96px)。彼得,它似乎是一种防范措施,除非Val具有非零/非空值,如果您创建类似于PATCH API方法的东西,对我来说这似乎不对。 – john

回答

6

随着空,条件运算符返回的值总是可以为空

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

如果实例为null,则实例?.VAL也将是无效的(大概诠释?你的情况)。所以,你总是应该与任何比较之前检查空值:

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

这意味着: 如果实例.VAL是空的(因为实例为null),则返回0,否则返回instance.Val?接下来比较这个值与0(不等于)。

7

你可以利用空coallescing运营商:

instance?.Val ?? 0 

instance为空或instance不为空,但Val是,上述表达式将评估为0,否则的Val值将被退回。

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

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

+0

是的,'(instance?.Val).GetValueOrDefault()'将在编译后与'(instance?.Val ?? 0)'相同,其中'0'是编译时常量,也被称为'default (INT)'。 –