0

这是 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();
  }

我的期望完全错误吗?这是一个错误的设计决定吗?我会写 areturn null而不是 a return string.Empty

请注意,有一个IsEmpty属性告诉标签是打开还是自关闭。

4

1 回答 1

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)转换。如果nullsourceXElementnull,但String.Empty为空时返回。如果null两者都返回,那将是令人困惑的。

如果您想检查元素是否不存在没有值,请使用String.IsNullOrEmpty方法而不是== null比较。

于 2013-08-16T14:25:08.267 回答