2010-08-12 43 views
2

讓我們有這樣的代碼:深備份陣列

class A : ICloneable 
{ 
    public int x = 2; 
    public A(int x) 
    { 
     this.x = x; 
    } 

    public A copy() 
    { 
     A a = new A(this.x); 
     return a; 
    } 

    public object Clone() 
    { 
     A a = new A(this.x); 
     return a; 
    } 
} 

在主要方法:

A[] Array1 = new A [4] ; 
Array1[0] = new A(0); 
Array1[1] = new A(1); 
Array1[2] = new A(2); 
Array1[3] = new A(3); 
A [] Array2 = new A[10]; 
Array. Copy(Array1, Array2, 4); 

Array2[2].x = 11; 
for (int i = 0; i < 4; i++) 
    Console.WriteLine(Array1[i].x); 

輸出:

雖然A類實現IClonable ...! 然後..實現IClonable在數組中的好處是什麼?

回答

6

http://msdn.microsoft.com/en-us/library/k4yx47a1.aspx

「如果sourceArray和destinationArray都是參考型陣列或是Object類型的兩個陣列,一個數組的淺拷貝是一個新的數組,其中包含與原始數組相同的元素的引用,元素本身或元素引用的任何數據都不會被複制「

可能有更好的方法比這,但你可以使用的一種技術是:

A[] array2 = array1.Select (a =>(A)a.Clone()).ToArray(); 
2

Array.Copy複製數組的值,在本例中爲引用。 Array.Copy()的文檔中沒有任何內容表示檢查實現IClonable的類並調用Clone()。您將需要遍歷數組並自己調用Clone()。

順便說一句,是的,IClonable種吸吮。

2

Array.Copy()不使用ICloneable。它簡單地存儲在每個單元的值複製(在這種情況下是到您的A對象的引用)

2

阿尼的答案使用LINQ從而爲C#2.0不起作用,然而同樣的方法可以使用Array類的ConvertAll方法來完成:

A[] Array2 = Array.ConvertAll(Array1,a => (A)a.Clone());