LINQ to XML Cloning

Vin*_*cio 3 .net c# xml linq xelement

谁能解释为什么原始地址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();
Run Code Online (Sandbox Code Playgroud)

OUTPUT

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> 
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

从问题:

看起来customer1持有对地址XElement的引用,但customer2和customer3已经获得了副本.

是的,这正是发生的事情.从XElement内容文档:

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

在第一种情况下,address没有父母,所以它直接附加.之后,它确实有父母,所以先克隆它.