2013-03-18 41 views
5

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 0
public 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.()

+2

Abbiamo bisogno di vedere il codice per vedere cosa è andato storto. Il campione di codice più breve che presenta il problema sarebbe il migliore. –

+1

Sì, ho capito che :) Implementalo ora, grazie – dylanmensaert

+1

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! –

risposta

3

Sembra che tu stia creando riferimenti a oggetti esistenti dappertutto anziché creare copie.

Gli oggetti personalizzati che stai passando nel nuovo oggetto sono BlockRows e BlockColumns? Quelli saranno solo riferimenti a BlockRows e BlockColumns nell'oggetto esistente, quindi la modifica di una di quelle istanze nel primo oggetto si rifletterà nel secondo.

Non so cosa rappresentino Grid, Peers e Units, ma molto probabilmente saranno anche riferimenti. Devi anche rendere tutte le lezioni clonabili. In caso contrario, la modifica di Grid nella prima classe SudokuAlgorithmNorvig cambierà il corrispondente Grid nella seconda istanza.

+0

Beh, i blocchi e le colonne sono impostati nel costruttore di SudokuAlgorithmNorvig. Quindi non so davvero come farlo. – dylanmensaert

+0

Rendili anche clonabili e passa 'BlockRows.Clone()' e 'BlockColumns.Clone() 'nel costruttore della nuova istanza. –

+0

Grid è una matrice bidimensionale di tipo Field (classe personalizzata in cui ho implementato il clone nello stesso modo). I peer e le unità sono hashmap che comprende anche il campo. Quindi devo fare qualcosa di speciale con hashmap e array per poter clonare? – dylanmensaert

Problemi correlati