首页 > 解决方案 > 为什么 XElement 的行为不像引用类型?

问题描述

我注意到这XElement是一门课,所以我尝试了类似的方法:

var doc = new XDocument(
    new XDeclaration("1.0", "utf8", "yes"),
    new XElement("Root")
    );
var root = doc.Root;
var com = new XElement("Component", new XAttribute("name", "arm"));
root.Add(com);
root.Add(com);
root.Add(com);
com.Add(new XAttribute("type", 1));

Console.WriteLine(doc);

但输出是:

<Root>
  <Component name="arm" type="1" />
  <Component name="arm" />
  <Component name="arm" />
</Root>

我也试过SetAttributeValue()了,得到了同样的结果。

为什么 type 属性只附加到第一个组件?

标签: c#xmllinq

解决方案


我最初的答案是(本质上是“设计”),这就是为什么......

MS 文档(并按照相关链接),您会发现

  • XElement继承XContainer继承XNode
  • XContainer具有方法Add()和属性FirstNode,并且LastNode
  • XNode有属性NextNodePreviousNode

如果Add()盲目地添加对同一对象的引用而不在必要时创建副本以避免多重引用,那么如何避免循环引用?在上面的示例中,FirstNode并且FirstNode.NextNode将引用相同的对象。


推荐阅读