C# 空条件运算符和=
随着在C#中引入,对于以下评估C# 空条件运算符和=,c#,null,evaluation,C#,Null,Evaluation,随着在C#中引入,对于以下评估 if (instance != null && instance.Val != 0) 如果我这样重写的话 if (instance?.Val != 0) 如果实例是空引用,它将被计算为true;它的行为就像 if (instance == null || instance.Val != 0) 那么,使用这种新语法重写计算的正确方法是什么呢 编辑: instance是从JSON反序列化的大对象的字段。有很多这样的代码,首先检查字段是否在JS
if (instance != null && instance.Val != 0)
如果我这样重写的话
if (instance?.Val != 0)
如果实例是空引用,它将被计算为true;它的行为就像
if (instance == null || instance.Val != 0)
那么,使用这种新语法重写计算的正确方法是什么呢
编辑:
instance
是从JSON反序列化的大对象的字段。有很多这样的代码,首先检查字段是否在JSON中,如果是,检查Val属性是否不等于常量,只有这两个条件都为真,执行一些操作
正如Peter在他的评论中指出的那样,代码本身可以被重构以使逻辑流更“有意义”,尽管在这个问题上,我感兴趣的是如何将
空条件运算符
与一起使用=代码> 您可以使用null coalescing操作符:
instance?.Val ?? 0
当instance
为null或instance
不为null但Val
为null时,上述表达式的计算结果将为0。否则将返回Val
的值
if ((instance?.Val).GetValueOrDefault() != 0)
那个?条件运算符将自动将.Val属性视为可空。使用Null条件运算符返回的值可以始终为Null
if ((instance?.Val ?? 0) != 0)
如果instance为null,那么instance?.Val也将为null(在您的例子中可能是int)。因此,在与任何内容进行比较之前,应始终检查空值:
if ((instance?.Val ?? 0) != 0)
这意味着:
如果instance?.Val为null(因为instance为null),则返回0。否则返回instance.Val。接下来将此值与0(不等于)进行比较 如果((instance?.Val??0)!=0),我会尝试做一些类似的事情。
实际上,它的行为类似于instance?.Val!=0
,其中由于短路null
不可能等于0
,因此整个表达式为true
。坦率地说,没有足够的上下文来知道如何“正确地”处理这个表达式。我觉得奇怪的是,null
值和零值都会导致相同的代码执行块。鉴于您正处于这种情况,可能有更好的方法来处理该场景。或者,不要在这里强加null条件,因为它所要做的就是降低代码的可读性。Peter,这似乎是为了防止执行某个操作,除非Val有一个非零/非空值,如果您创建的是类似于修补程序API方法的东西,这对我来说似乎没有错。@john,谢谢,我刚刚玩了这个片段。在这种情况下,我会坚持使用旧的空检查,因为代码变得不那么可读,它超过了节省一些输入的好处。是的,并且(instance?.Val)。GetValueOrDefault()在编译后将与(instance?.Val?.0)
相同,其中0
是编译时间常量,也称为默认值(int)
。我花了2分钟查找这两个代码示例之间的差异