2014-05-07 4 views
1

Le résultat de ce code est "1" et "2". Quand je divise Foo "a" ça fait une instance "b" et tout ce que je fais pour "b", ça arrive aussi à "a". Existe-t-il une solution pour redonner une instance complètement indépendante de Foo? Donc le résultat de mon code serait "1" et "1".Instance indépendante de clonage

using System.IO; 
using System; 
using System.Collections.Generic; 

class Program 
{ 
    static void Main() 
    { 

     Baar b0 = new Baar(); 
     Baar b1 = new Baar(); 
     Baar b2 = new Baar(); 
     Baar b3 = new Baar(); 
     Foo a = new Foo(200); 
     a.addBaar(b0); 

     Console.WriteLine(a.baars.Count); 
     Foo b = a.split(100); 

     b.addBaar(b1) ;  
     Console.WriteLine(a.baars.Count); 

    } 
} 

class Foo 
{ 
    public int amount; 
    public List<Baar> baars = new List<Baar>(); 
    public Foo(int amount) 
    { 
     this.amount = amount; 
    } 

    private Foo(int amount, List<Baar> baars) 
    { 
     this.amount = amount; 
     this.baars = baars; 
    } 

    public void addBaar(Baar baar) 
    { 
     this.baars.Add(baar); 

    } 

    public Foo split(int amount) 
    { 
     int diff = this.amount - amount; 
     this.amount = amount; 
     return new Foo(diff, this.baars); 
    } 
} 

class Baar 
{ 

    public Baar() 
    { 

    } 
} 
+2

"Le résultat de ce code est "1" et "2".' '... Donc, le résultat de mon code serait "1" et "2"." - est-ce une faute de frappe, ou votre code fait-il déjà ce que vous voulez? – Blorgbeard

+1

duplication possible de [Objets de clonage profond] (http://stackoverflow.com/questions/78536/deep-cloning-objects) –

+0

oui c'était une faute de frappe. lol. je l'ai corrigé. – user3568719

Répondre

1
méthode

Votre split passe autour d'une référence à la même sous-jacente liste baars. Cela peut être démontré simplement avec:

List<int> a = new List<int>(); 
a.Add(1); 

Console.WriteLine(a.Count); //1 

List<int> b = a; 
b.Add(2); 

Console.WriteLine(b.Count); //2 
Console.WriteLine(a.Count); //2 
Console.WriteLine(Object.ReferenceEquals(a, b)); //true 

Au lieu de cela, vous voulez passer une copie de cette liste:

public Foo split(int amount) 
{ 
    int diff = this.amount - amount; 
    this.amount = amount; 
    List<Baar> baarsCopy = new List<Baar>(this.baars); //make a copy 
    return new Foo(diff, baarsCopy); //pass the copy 
} 

EDIT: Au-delà, je ne sais pas si vous voulez faire Copie des éléments Baar dans cette liste et partage/partage des références avec les mêmes instances Baar. C'est à vous et à votre utilisation de l'application.