質問

元のアドレス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のクローンを配置します customer2customer3. 。これで、3つの同等の「アドレス」Xelementsができました。

他のヒント

質問から:

Customer1はアドレスXelementへの参照を保持しているように見えますが、Customer2とCustomer3はコピーを取得しています。

はい、それがまさに起こることです。から Xelementコンテンツのドキュメント:

XnodeまたはXattributeオブジェクトを追加すると、新しいコンテンツに親がない場合、オブジェクトはXMLツリーに単に接続されます。新しいコンテンツが既に育てられており、別のXMLツリーの一部である場合、新しいコンテンツがクローン化され、新しくクローン化されたコンテンツがXMLツリーに添付されます。

最初のケースでは、 address 親がいないので、直接添付されています。その後、それ します 親がいるので、最初にクローンされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top