Question

Quelqu'un peut-il expliquer pourquoi l'adresse d'origine noeud change de rue XElement? Il ressemble à Customer1 contient une référence à l'adresse XElement mais client2 et customer3 ont pris des copies.

Pourquoi le changement d'adresse d'origine? (Exemple 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();

SORTIE

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> 
Était-ce utile?

La solution

Le même XElement ne peut pas être dans plusieurs arbres. Vous pouvez certainement avoir plusieurs références au même XElement dans un arbre particulier, mais même XElement ne peut pas être dans les arbres multiples .

Pour customer1, vous avez vraiment et vraiment ajouté que address XElement. Au moment où vous « ajouté » à customer2, le XElement de address1 réelle ne pouvait pas vraiment être ajouté, car il est déjà un nœud dans un autre XElement. Comme il ne pouvait pas ajouter le address d'origine comme un nœud, le constructeur XElement place un clone de ce XElement dans customer2 et customer3. Vous avez maintenant trois XElements « adresse » équivalent.

Autres conseils

De la question:

  

Il ressemble à Customer1 est titulaire d'un   référence à la XElement d'adresse, mais   client2 et customer3 ont pris   des copies.

Oui, c'est exactement ce qui se passe. De docs pour le contenu XElement :

  

Lors de l'ajout XNode ou XAttribute   objets, si le nouveau contenu n'a pas   parent, les objets sont tout simplement   attaché à l'arbre XML. Si la nouvelle   le contenu est déjà parented et   partie d'un autre arbre XML, le nouveau   le contenu est cloné, et le nouveau   contenu clonée est attaché au XML   arbre.

Dans le premier cas, address n'a pas de parent de sorte qu'il est attaché directement. Par la suite, il Finalité un parent, il est donc cloné d'abord.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top