重新解析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);
}
}
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;