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 のクローンをcustomer2およびに配置しcustomer3ます。これで、同等の「アドレス」XElement が 3 つあります。

于 2010-04-13T13:14:08.707 に答える