2014-05-07 125 views
1

此代碼的結果是「1」和「2」。當我將Foo「a」分開時,它會創建一個「b」實例,以及我對「b」所做的所有事情,它恰好也是「a」。 是否有任何解決方案可以給出完全獨立的Foo實例?所以我的代碼的結果將是「1」和「1」。克隆獨立實例

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

「這段代碼的結果是 」1「 和 」2「。'...'所以我的代碼的結果將是 」1「 和 」2「。」 - 是這些錯誤之一,還是你的代碼已經做了你想要的? – Blorgbeard

+1

[Deep cloning objects]的可能重複(http://stackoverflow.com/questions/78536/deep-cloning-objects) –

+0

是的,這是一個錯字。大聲笑。我已糾正它。 – user3568719

回答

1

split你方法繞過到相同參考底層baars列表。這可以證明簡單地:

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 

相反,你想傳遞的是列表的副本

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 
} 

編輯:除此之外,我不知道,如果你想該列表中的Baar項目的副本,或者傳遞/共享對同一個Baar實例的引用。這取決於您和您的應用程序使用情況。