是否可以使用C#'??'运算符如下:
var _var = pr.Value ?? "NA";
要检查pr是否为null,而不是pr的Value属性是否为null?
我找不到任何显示类似这样的例子。
如果是,在这种情况下是否建议使用扩展方法?
答案 0 :(得分:4)
这里有3种不同的情况,因此让我们仔细研究每种情况的语法:
如果 "NA"
或pr
为空,则返回pr.Value
:
var _var = pr?.Value ?? "NA";
?.
运算符基本上会说:“如果pr
为null,则为整个表达式返回null,并且不取消引用pr.Value
”
因此,如果pr
为null,则?.
运算符将使表达式的结果为null,或者,如果pr.Value
为null,则它的结果也将为null,在两种情况下, ?? "NA"
会将整个项目评估为"NA"
。
在结果上等效于此:
string _var;
if (pr is null || pr.Value is null)
_var = "NA";
else
_var = pr.Value;
如果"NA"
为空,则返回pr.Value
:
var _var = pr.Value ?? "NA";
这就是你所拥有的。如果NullReferenceException
为空,这将抛出pr
,但是如果"NA"
为非空但pr
为空,则求值为pr.Value
。
在结果上等效于此:
string _var;
if (pr.Value is null) // can throw NullReferenceException
_var = "NA";
else
_var = pr.Value;
如果"NA"
为空,则返回pr
,如果pr.Value
为空,该怎么办?
??
和?.
都无法为您提供帮助,但是您可以使用三元运算符:
var _var = (pr is null)
? "NA"
: pr.Value;
如果"NA"
为空,则该值为pr
,如果pr.Value
为非空,则该值为pr
,因此,如果{{1 }}为非null,但pr
为null。
注意,对pr.Value
运算符的评价也很慢,就像三元运算符一样,因此,如果您具有以下条件:
??
并且该方法调用很昂贵,只有在var _v = pr?.Value ?? ComputeTheValue();
实际上为空,如果pr?.Value
为非空且pr
为非空时,才会评估该方法调用被制成。
答案 1 :(得分:2)
要检查 pr是否为空,并且不检查pr的Value属性是否为空?
似乎您只想检查pr
是否为空。在这种情况下,三元运算符是您的选择
var _var = pr == null ? "NA" : pr.Value;
或使用简单的if
/ else
。