1

Resharper 在元素方法调用被检查为空(TransformElementBad 方法)之后为它提供了一个可能的空引用警告,但是如果我将元素值保留在某个变量中,一切都很好。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);
    }
}
4

3 回答 3

1

Value可能这null就是它发出警告的原因,因此您必须null在调用之前进行检查Trim(),如果确定始终存在Value则不需要空检查。

format = field.Element("ViewFormatInfo").Value !=null ? field.Element("ViewFormatInfo").Value.Trim() : string.Empty; 
于 2014-09-18T12:40:05.507 回答
1

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

于 2014-09-18T19:27:31.897 回答
0

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

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

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

另外,请注意

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

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

于 2019-08-16T15:09:21.353 回答