3

谁能解释为什么原始地址 XElement 街道节点会更改?看起来 customer1 持有对地址 XElement 的引用,但 customer2 和 customer3 已复制。

为什么原来的地址变了?(LINQPad 示例)

var address =
    new XElement ("address",
        new XElement ("street", "Lawley St"), 
        new XElement ("town", "North Beach")
    );

var customer1 = new XElement ("customer1", address);
var customer2 = new XElement ("customer2", address);
var customer3 = new XElement ("customer3", address);

customer1.Element ("address").Element ("street").Value = "Another St";

Console.WriteLine (customer2.Element ("address").Element ("street").Value);
Console.WriteLine ();

address.Dump();
Console.WriteLine ();

customer1.Dump();
Console.WriteLine ();

customer2.Dump();
Console.WriteLine ();

customer3.Dump();

输出

Lawley St


<address>
  <street>Another St</street>
  <town>North Beach</town>
</address> 


<customer1>
  <address>
    <street>Another St</street>
    <town>North Beach</town>
  </address>
</customer1> 


<customer2>
  <address>
    <street>Lawley St</street>
    <town>North Beach</town>
  </address>
</customer2> 


<customer3>
  <address>
    <street>Lawley St</street>
    <town>North Beach</town>
  </address>
</customer3> 
4

2 回答 2

8

从问题:

看起来 customer1 持有对地址 XElement 的引用,但 customer2 和 customer3 已复制。

是的,这正是发生的事情。来自XElement 内容的文档

添加 XNode 或 XAttribute 对象时,如果新内容没有父对象,则这些对象只是简单地附加到 XML 树。如果新内容已经是父内容并且是另一个 XML 树的一部分,则克隆新内容,并将新克隆的内容附加到 XML 树。

在第一种情况下,address没有父级,因此直接附加。之后,它确实有一个父母,所以它首先被克隆。

于 2010-04-13T13:09:41.903 回答
1

同一个 XElement 不能位于多个树中。您当然可以在特定树中对同一个 XElement 有多个引用,但同一个 XElement 不能在多个树中

customer1,您确实添加了addressXElement。当您将它“添加”到customer2时,实际的address1XElement 无法真正添加,因为它已经是另一个 XElement 中的一个节点。由于它无法将原始元素添加address为节点,因此 XElement 构造函数将该 XElement 的克隆放置在customer2and中customer3。您现在拥有三个等效的“地址”XElement。

于 2010-04-13T13:14:08.707 回答