In seguito a questo sito: http://www.csharp411.com/c-object-clone-wars/Come creare manualmente una copia profonda
ho deciso di creare manualmente una copia completa della mia classe (seguente sito 1. Clone manualmente). Ho implementato l'interfaccia clone e tutte le proprietà necessarie. Ho eseguito il mio programma e controllato se il mio clone fosse effettivamente uguale all'istanza originale. Questo era corretto.
Tuttavia, la mia nuova istanza fa ancora riferimento a quella originale. Quindi eventuali modifiche nella mia copia in cui si riflette nell'istanza originale.
Quindi, se questo non crea una copia profonda, allora che cosa fa? Cosa potrebbe essere andato storto?
(voglio fare una copia profonda manualmente per aumentare le mie prestazioni, in modo da non voglio utilizzare la classe ObjectCopier. (anche se funziona benissimo, ci vuole il 90% del mio codice fase di esecuzione).
Frammenti di codice:
utensileria Classe: metodo
public class SudokuAlgorithmNorvig: ICloneable
{
Clone:
Metodo 0public object Clone()
{
SudokuAlgorithmNorvig sudokuClone = new SudokuAlgorithmNorvig(this.BlockRows, this.BlockColumns);
sudokuClone.IsSucces = this.IsSucces;
if (this.Grid != null) sudokuClone.Grid = (Field[,])this.Grid;
if (this.Peers != null) sudokuClone.Peers = (Hashtable)this.Peers;
if (this.Units != null) sudokuClone.Units = (Hashtable)this.Units;
return sudokuClone;
}
Clone chiamata:
SudokuAlgorithmNorvig sudokuCopy = (SudokuAlgorithmNorvig)sudoku.Clone()
ho fatto il (metodo clone attuazione e l'impostazione) stesso in tutte le mie altre classi.()
Abbiamo bisogno di vedere il codice per vedere cosa è andato storto. Il campione di codice più breve che presenta il problema sarebbe il migliore. –
Sì, ho capito che :) Implementalo ora, grazie – dylanmensaert
Ok, sembra che tu stia facendo solo un clone superficiale dell'oggetto. Ad esempio, 'sudokuClone.Grid = (Field [,]) this.Grid' NON sta indicando' sudokuClone.Grid' in una nuova copia! –