2010-08-12 6 views
2

nous allons avoir ce code:Copie profonde avec Array

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; 
    } 
} 

dans la principale Méthode:

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); 

la sortie:

Bien que la classe A implémente IClonable ... !! alors .. quel est l'avantage de mettre en œuvre IClonable In Array ?? Array.Copy copie les valeurs du tableau, dans ce cas, des références.

Répondre

6

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

« Si sourceArray et destinationArray sont les deux tableaux de type de référence, ou les deux tableaux de type objet, Une copie superficielle d'un tableau est un nouveau tableau contenant des références aux mêmes éléments que le tableau d'origine Les éléments eux-mêmes ou tout élément référencé par les éléments ne sont pas copiés "

Il peut y avoir une meilleure méthode que cela, mais une technique que vous pourriez utiliser est:

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

Il n'y a rien dans la documentation de Array.Copy() qui indique une vérification pour les classes qui implémentent IClonable et appellent Clone() à la place. Vous devrez parcourir le tableau en boucle et appeler Clone() vous-même.

BTW, oui, IClonable sorte de suce.

2

Array.Copy() n'utilise pas ICloneable. Il suffit de copie les valeurs stockées dans chaque cellule (qui dans ce cas sont des références à vos objets A)

2

réponse Ani utilise LINQ ne fonctionne donc pas pour C# 2.0, mais une même méthode peut être fait en utilisant ConvertAll de la classe Array méthode:

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