【问题标题】:use of ?? to get attributes of an object if the object isn't null用于 ??如果对象不为空,则获取对象的属性
【发布时间】:2018-11-23 09:23:54
【问题描述】:

是否可以使用 C# '??'这样的操作符:

var _var = pr.Value ?? "NA";

检查pr是否为null,而不是pr的Value属性是否为null?

我没有找到任何显示此类内容的示例。

如果是,是推荐还是在这种情况下使用扩展方法更好?

【问题讨论】:

标签: c# operators isnull


【解决方案1】:

这里有 3 种不同的场景,让我们来看看每种场景的语法:

  1. 如果prpr.Value 为空,则返回"NA"

    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;
    
  2. 如果pr.Value 为空,则返回"NA"

    var _var = pr.Value ?? "NA";
    

    这就是你所拥有的。如果pr 为空,这将抛出NullReferenceException,但如果pr 为非空但pr.Value 为空,则评估为"NA"

    这在结果方面等价于:

    string _var;
    if (pr.Value is null) // can throw NullReferenceException
        _var = "NA";
    else
         _var = pr.Value;
    
  3. 如果pr 为空,则返回"NA" 并且...如果pr.Value 为空怎么办?

    ???. 都不能在这里为您提供帮助,但您可以使用三元运算符:

    var _var = (pr is null)
        ? "NA"
        : pr.Value;
    

    如果pr 为空,则计算结果为"NA",如果pr 为非空,则计算为pr.Value,因此如果pr 为非空但pr.Value,则计算结果为空为空。


注意?? 运算符也是惰性求值的,就像三元运算符一样,所以如果你有这个:

var _v = pr?.Value ?? ComputeTheValue();

并且该方法调用代价高昂,仅当pr?.Value 实际为空时才会对其进行评估,如果pr 为非空且pr.Value 为非空,则不会进行调用。

【讨论】:

    【解决方案2】:

    检查pr是否为nullpr的Value属性是否为null

    似乎您只想检查 pr 是否为空。在这种情况下,您可以选择三元运算符:

    var _var = pr == null ? "NA" : pr.Value;
    

    或使用简单的if/else

    【讨论】:

    • 随着 C# 7 的引入,is null 在一般情况下比== null 更好用,因为它永远不会使用运算符重载,它总是只需做一个参考检查(参考类型)。
    • @LasseVågsætherKarlsen 我不知道......确实很有见地,从现在开始我会记住这一点。由于您已经发布了该解决方案,因此我将按原样保留我的答案。赞赏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多