重新解析XElement Element方法上可能存在的null引用警告

本文关键字:存在 null 引用 警告 XElement 新解析 Element 方法 | 更新日期: 2023-09-27 18:22:47

Resharper在检查Element方法调用是否为null(TransformElementBad方法)后,为其提供了一个可能的null引用警告,但如果我在某个变量中保留元素值,则一切都可以。ReSharper是对的,我应该使用它的建议,还是它是一个bug?

// 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);
    }
}

重新解析XElement Element方法上可能存在的null引用警告

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

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

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

我不想在这里挖坟墓,但由于没有解决方案(只有对这种行为的解释),不妨用这个线程来分享我的想法。

因此,虽然我无法反驳JetBrains在这个问题上的立场,但我注意到,在C#和以后的版本中,使用空条件访问可以避免这种烦人的警告:

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

此外,请注意

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

也就是说,在具有null条件的Value属性上调用Trim()方法不会抛出NullReferenceException(就像Value本身为null一样),而是简单地向调用者返回null;