XElement.Value中的奇怪和null值

时间:2012-11-08 08:00:57

标签: linq-to-xml

这是LINQ to XML中的一个奇怪行为。这是一个参考XML文档。

<Root>
  <First>first</First>
  <Second></Second>
  <Third />
</Root>

正如您所期望的那样root.Element("First").Value == "first"是真的。

正如您所期望的那样root.Element("Second").Value == ""是真的。

我希望root.Element("Third").Valuenull。但事情就是这样:root.Element("Third ").Value返回一个空字符串。

以下是.NET框架的源代码:

public string Value
{
  get
  {
    if (this.content == null)
    {
        return string.Empty;
    }
    string text = this.content as string;
    if (text != null)
    {
        return text;
    }
    StringBuilder stringBuilder = new StringBuilder();
    this.AppendText(stringBuilder);
    return stringBuilder.ToString();
  }

我的期望是否明白错误?这是一个错误的设计决定吗?我会写一个return null而不是return string.Empty

请注意,有一个IsEmpty属性可以判断标签是打开还是自动关闭。

1 个答案:

答案 0 :(得分:0)

我同意,这只是一个设计选择,但我会说这是一个很好的选择!请考虑以下查询:

var items = from e in doc.Elements("name")
            where e.Value.Length < 10
            select e;

如果XElement.Value确实为空元素返回null,则查询将抛出NullReferenceException!使用String.Empty时,它不会那样做。

同样的事情适用于Explicit(XElement to String)转换。如果源nullXElement,则返回null,而当String.Empty为空时返回null。如果确实为两者返回String.IsNullOrEmpty,那将会令人困惑。

如果您想检查元素是否不存在没有值,请使用== null方法代替{{1}}比较。