这是LINQ to XML中的一个奇怪行为。这是一个参考XML文档。
<Root>
<First>first</First>
<Second></Second>
<Third />
</Root>
正如您所期望的那样root.Element("First").Value == "first"
是真的。
正如您所期望的那样root.Element("Second").Value == ""
是真的。
我希望root.Element("Third").Value
为null
。但事情就是这样: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
属性可以判断标签是打开还是自动关闭。
答案 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)
转换。如果源null
为XElement
,则返回null
,而当String.Empty
为空时返回null
。如果确实为两者返回String.IsNullOrEmpty
,那将会令人困惑。
如果您想检查元素是否不存在或没有值,请使用== null
方法代替{{1}}比较。