web-dev-qa-db-fra.com

Dois-je créer .Clone () sur une classe ou créer un constructeur de copie?

Je ne sais pas trop ce que je devrais utiliser en C # - les deux devraient en théorie faire la même chose, mais je pense que les deux sont assez facilement supervisés. Ou existe-t-il une autre possibilité à prendre en considération?

Je sais qu'en C++, vous utilisez des constructeurs de copie. Mais en C # je n'en ai jamais beaucoup entendu parler (ils sont juste un ctor avec self en paramètre et devraient réaffecter toutes les données)

Mon copieur-copie doit-il également copier en profondeur tous les objets ou les réaffecter uniquement?

Qu'est-ce qui est considéré comme la "meilleure pratique" pour ce scénario?

6
Mafii

Utilisez des constructeurs de copie. Voici pourquoi:

  1. IClonable la sémantique est ambiguë. Microsoft n'a jamais spécifié si un clone devait être une copie superficielle ou profonde.

  2. Vous pouvez spécifier un comportement personnalisé dans votre constructeur de copie, comme donner à chaque copie son propre ID unique ou copier uniquement certains champs et pas d'autres.

Lectures complémentaires
Copier constructeur vs clone en C #

4
Robert Harvey

J'irais pour la méthode clone si la classe impliquée était polymorphe (de sorte qu'une instance du bon type d'exécution a été créée).

Sinon c'est une question de goût à mon avis.

2
Bwmat

En ce qui concerne la modification des enregistrements lorsque l'utilisateur appuie sur "ok" dans la boîte de dialogue, vous devez le comparer avec l'instance d'enregistrement de base de données. Vous ne pouvez pas compter sur le clonage du get HTTP d'origine car quelqu'un a peut-être modifié l'enregistrement avant vous et vous obtenez des conditions de concurrence.

Si ce n'est pas le cas, cela a été couvert par un autre fil et j'espère que cela vous aidera. https://stackoverflow.com/questions/78536/deep-cloning-objects

0
StackOverFowl