2010-08-12 4 views
2

давайте этот код:Deep Copy с массивом

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 In Array?

ответ

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() самостоятельно.

BTW, да, IClonable отстой.

2

Array.Copy() не использует ICloneable. Он просто копирует значения хранятся в каждой ячейке (в данном случае ссылки на ваши объекты A)

2

ответ Ани использует LINQ таким образом не работает на C# 2.0, однако же метод может быть сделано с помощью ConvertAll метода, Array класса для:

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