Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 空条件运算符和=_C#_Null_Evaluation - Fatal编程技术网

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

随着在C#中引入,对于以下评估

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分钟查找这两个代码示例之间的差异