【问题标题】:Resharper possible null reference warning on XElement Element methodResharper XElement Element 方法上可能出现的空引用警告
【发布时间】:2014-09-18 12:37:32
【问题描述】:

Resharper 在元素方法调用被检查为 null(TransformElementBad 方法)之后给出了可能的 null 引用警告,但如果我将元素值保留在某个变量中,一切都很好。 ReSharper 是否正确,我应该使用它的建议还是它是一个错误?

// JetBrains ReSharper 8.2.1 
// Build 8.2.1000.4556 on 2014-05-19T09:12:38

public class Transformer
{
    private void TransformElementBad(XElement field)
    {
        var format = string.Empty;

        if (field.Element("ViewFormatInfo") != null)
            format = field.Element("ViewFormatInfo").Value.Trim(); // ![got][1] warning here

        Console.WriteLine(format);
    }

    private void TransformElementGood(XElement field)
    {
        var format = string.Empty;

        var element = field.Element("ViewFormatInfo");
        if (element != null)
            format = element.Value.Trim();

        Console.WriteLine(format);
    }
}

【问题讨论】:

    标签: c# xelement resharper-8.2


    【解决方案1】:

    Value 可以是null,这就是它发出警告的原因,所以你必须在调用Trim() 之前检查null,如果确定其中总会有Value那么就不需要空检查了。

    format = field.Element("ViewFormatInfo").Value !=null ? field.Element("ViewFormatInfo").Value.Trim() : string.Empty; 
    

    【讨论】:

    • @Ehsan 看截图i.stack.imgur.com/165MA.png 它没有突出显示“值”,只有 Element() 调用
    • 一开始你没有检查字段是否为空if(field !=null)
    • @ehsan-sajjad 它也没有帮助,仍然收到警告
    • 你把那个放在哪里了?
    • Value 不返回 null。所以这个答案是不正确的。
    【解决方案2】:

    来自供应商的回答:元素方法不是纯的,并且在给定相同参数的情况下无法返回相同的结果。因此,如果要避免此警告,则必须将其结果复制到局部变量中 https://youtrack.jetbrains.com/issue/RSRP-424149

    【讨论】:

      【解决方案3】:

      我不是要在这里挖坟,但由于没有解决方案(仅对此行为的解释),不妨与此线程分享我的想法。

      因此,虽然我无法与 JetBrains 对这个问题的立场争论不休,但我注意到您可以在 C# 6 及更高版本中使用 null-conditional access 避免这个恼人的警告:

      var format = field.Element("ViewFormatInfo")?.Value.Trim();
      

      另外,请注意

      空条件运算符是短路的。也就是说,如果条件成员或元素访问操作链中的一个操作返回 null,则链的其余部分不会执行。

      这意味着,在 Value 属性上以 null 条件调用 Trim() 方法不会抛出 NullReferenceException(好像 Value 本身为 null),而只是将 null 返回给调用者;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-27
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-17
        相关资源
        最近更新 更多