2014-04-01 46 views
3

考慮下面的代碼:重新分配的類索引的陣列(引用類型)

//Written in a WPF project, simply attach the handler to a button for testing code. 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public class A 
    { 
     public int X; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     A[] Collection = new A[2]; 
     for (int i = 0; i < Collection.Length; i++) 
     { 
      Collection[i] = new A(); 
     } 

     Collection[0].X = 1; 
     Collection[1] = Collection[0]; 
     Collection[0].X = 2; 
     MessageBox.Show("Collection[0].X = " + Collection[0].X + ", Collection[1].X = " + Collection[1].X); 
     //The messagebox produces: "Collection[0].X = 2, Collection[1].X = 2" 
     //Wanted behaviour: "Collection[0].X = 2, Collection[1].X = 1" 
    } 

} 

由於類的數組,集合,是引用類型。集合[0]指向與集合[1]相同的內存區域。

我的問題是,如何才能 「拷貝」 集合[0]值集合[1],所以我得到以下輸出:

「集合[0] .X = 2,集合[ 1] .X = 1「

+1

只是說 - 值類型...如果你使'class A'成爲'struct',而不是它做你想要的。 – doctorlove

回答

1

如果要克隆的類與示例中一樣簡單,則可以使用MemberwiseClone方法創建對象的淺表副本。爲了做到這一點,你需要在你的類訪問MemberwiseClone實現的方法,因爲它是受保護的:

public class A 
{ 
    public int X; 

    public A Clone() 
    { 
     return (A) MemberwiseClone(); 
    } 
} 

然後換行

Collection[1] = Collection[0]; 

Collection[1] = Collection[0].Clone(); 

在更復雜的情況下,您需要創建自己的機制來創建對象的深層副本(例如,使用序列化手動創建新對象)。

另請參閱上述鏈接中的示例以瞭解詳細信息。

+0

'MemberwiseClone'是'protected',通常對外部調用者不可用(除非方法是相同的類型) –

+0

@MarcGravell:謝謝你的提示。 – Markus

+0

@Markus:非常好!非常感謝,知道這個問題讓我感到非常沮喪,但由於我沒有編寫代碼的經驗,所以無法解決這個問題。等待分鐘來標記接受的答案。 – LamaCoder