2017-09-17 4 views
0

J'ai lu que Array.Clone performs shallow copy, cependant ce code suggère qu'une copie profonde du tableau original est créée, c.-à-d. Que les modifications du tableau cloné ne sont pas reflétées dans le tableau originalArray.Clone() effectue une copie profonde au lieu d'une copie superficielle

int[] arr = new int[] { 99, 98, 92, 97, 95 }; 
int[] newArr = (int[])arr.Clone(); 
//because this is a shallow copy newArr should refer arr 
newArr[0] = 100; 
//expected result 100 
Console.WriteLine(arr[0]);//print 99 

Est-ce que je manque quelque chose d'évident ici?

Répondre

1

Lors de la copie d'une collection de struct immuables (primitives telles que c'est sont immutables) il n'y a pas de différence entre une copie profonde et peu profonde. Ils sont copiés par valeur - et donc il est aussi performant que la copie.

Voir plus la différence sous: What is the difference between a deep copy and a shallow copy?

+0

Une meilleure description serait « Lors de la copie d'une collection d'objets immuables il n'y a pas de différence entre une copie profonde et peu profonde. », Toutes les primitives sont immuables, mais vous pouvez voir ce même comportement sur un ensemble d'objets purement immuables. –

+0

En y réfléchissant, vous devez dire «Structures immuables» pour que la deuxième partie de votre réponse soit vraie. Les classes immuables se comporteraient encore techniquement différemment, car une seule copie de l'objet immuable sera en mémoire. –

0

Essayez le même code mais avec une classe qui a une propriété qui est un nombre entier. Puisque les éléments du tableau sont des types de valeur, les éléments du tableau cloné sont leurs propres "instances".

exemple:

class SomeClass { 
    public Int32 SomeProperty { get; set; } 
} 

SomeClass[] arr = new [] { 
    new SomeClass { SomeProperty = 99 }, 
    new SomeClass { SomeProperty = 98 }, 
    new SomeClass { SomeProperty = 92 }, 
    new SomeClass { SomeProperty = 97 }, 
    new SomeClass { SomeProperty = 95 } 
} 

SomeClass[] newArr = (SomeClass[])arr.Clone(); 

newArr[0].SomeProperty = 100; 

Console.WriteLine(arr[0].SomeProperty); 
2

parce que c'est un newArr peu profond copie doit se référer arr

Nope, le tableau et ses éléments sont copiés. Mais les références aux objets dans les éléments ne sont pas copiées.

La copie ne descend que d'un niveau: donc peu profonde. Une copie en profondeur serait clone tous les objets référencés (mais cela ne peut pas être montré avec ints.)

0

dans une matrice avancée Liste <> est vraiment difficile à utiliser que Array.Clone() utiliser à la place un plugin comme FastDeepCloner, il va cloner l'objet de manière intrusive.

var newArr= FastDeepCloner.DeepCloner.Clone(arr);