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)
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)
从问题:
看起来customer1持有对地址XElement的引用,但customer2和customer3已经获得了副本.
是的,这正是发生的事情.从XElement内容的文档:
添加XNode或XAttribute对象时,如果新内容没有父对象,则只需将对象附加到XML树.如果新内容已经是父级并且是另一个XML树的一部分,则克隆新内容,并将新克隆的内容附加到XML树.
在第一种情况下,address没有父母,所以它直接附加.之后,它确实有父母,所以先克隆它.