質問
元のアドレスXelement Streetノードが変更される理由を誰かが説明できますか? 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>
解決
同じXelementを複数の木に載せることはできません。確かに特定のツリーの同じXelementに複数の参照を持つことができますが、 同じXelementを複数の木に載せることはできません.
に customer1
, 、あなたは本当にそして本当にそれを追加しました address
Xelement。あなたがそれを「追加」するまでに customer2
, 、実際の address1
Xelementは、すでに別のXelementのノードであるため、実際には追加できませんでした。オリジナルを追加できなかったためです address
ノードとして、XelementコンストラクターはそのXelementのクローンを配置します customer2
と customer3
. 。これで、3つの同等の「アドレス」Xelementsができました。
他のヒント
質問から:
Customer1はアドレスXelementへの参照を保持しているように見えますが、Customer2とCustomer3はコピーを取得しています。
はい、それがまさに起こることです。から Xelementコンテンツのドキュメント:
XnodeまたはXattributeオブジェクトを追加すると、新しいコンテンツに親がない場合、オブジェクトはXMLツリーに単に接続されます。新しいコンテンツが既に育てられており、別のXMLツリーの一部である場合、新しいコンテンツがクローン化され、新しくクローン化されたコンテンツがXMLツリーに添付されます。
最初のケースでは、 address
親がいないので、直接添付されています。その後、それ します 親がいるので、最初にクローンされます。