2010-10-11 5 views
0

La copie peu profonde est quand j'écris nouveau List<List<ClassA>>(lsA) qui copie juste le membre ls. Donc, peu profondes copie la première liste tandis que la liste intérieure ne l'est pas. Étant donné que MyList a accès à chaque T mis en (ce qui est juste en passant par la liste C# dans cet exemple), il peut faire une copie superficielle de chacun d'eux. Alors maintenant, tous les membres de MyList sont copiés et les variables auxquelles ils peuvent accéder directement.Quel est ce type de copie appelée et est-ce mauvaise pratique?

Quel type de copie est-ce? Son seulement faire une copie superficielle sur ses vars intérieurs donc ce n'est pas une copie profonde? puisque ses varses de copie peuvent toucher et non pas seulement un membre, il n'est plus une copie superficielle. Ce type de copie s'appelle-t-il quelque chose? est-ce aussi une mauvaise pratique puisque ce n'est pas une copie profonde et peut-être pas plus utile qu'une copie superficielle?

class ClassA { int a; } 
class MyList<T> { List<T> ls; /*i cheat */ } 
MyList<MyList<ClassA>> lsA; 

Répondre

0

Je ne suis pas sûr de ce que le code en bas essaie de dire, cependant, voici mon tout cas (et la question n'est pas langue agnostique):

Si les données (les objets) est/sont immuable alors le type de copie est pour la plupart muet (en fait, il n'y a pas de raison pour une copie profonde avec des objets immuables!). En réduisant la quantité d'immutabilité, je n'ai généralement pas de copies en profondeur (à peu près jamais) et une «copie superficielle» utilisant les constructeurs standard fonctionne bien.

Notez que pour, disons, la liste < T>, il y a un ctor List<T>(IEnumerable<T> collection). Cela crée à son tour le nouvel objet en ajoutant tour à tour chaque élément de l'Enumerable existant et les règles suivent le comportement standard de type "ref"/"struct" (souvenez-vous que les types struct peuvent être enfermés de façon surprenante). Notez que ce constructeur ne copie pas les valeurs des objets item de Enumerable (cela ne fait pas implique la création d'un objet dupliqué pour les objets "ref").

Questions connexes