następstwie tej strony: http://www.csharp411.com/c-object-clone-wars/Jak ręcznie utworzyć kopię głęboki
postanowiłem ręcznie utworzyć głęboką kopię mojej klasie (po stronie 1. Clone ręcznie). Zaimplementowałem interfejs klona i wszelkie niezbędne właściwości. Wykonałem mój program i sprawdziłem, czy mój klon jest rzeczywiście równy pierwotnej instancji. To było poprawne.
Jednak moja nowa instancja wciąż odnosiła się do oryginalnej. Więc wszelkie zmiany w mojej kopii, które zostały odzwierciedlone w oryginalnej instancji.
Więc jeśli to nie tworzy głębokiej kopii, to co? Co mogło pójść nie tak?
(Chcę, aby głęboka kopia ręcznie, aby zwiększyć swoją wydajność, więc nie chcę użyć klasy ObjectCopier. (nawet jeśli to działa świetnie, zajmuje 90% mojego kodu czasie wykonywania).
Fragmenty kodu:
implementuje klasa: metoda
public class SudokuAlgorithmNorvig: ICloneable
{
Clone:
Metoda 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 wezwanie:
SudokuAlgorithmNorvig sudokuCopy = (SudokuAlgorithmNorvig)sudoku.Clone()
zrobiłam sama (wykonawczą i ustawienie metody clone) we wszystkich moich innych klas. (Field
+ Coordinate
)
Musimy zobaczyć Twój kod, aby zobaczyć, co poszło nie tak. Najkrótsza próbka kodu, która wykazuje problem, byłaby najlepsza. –
Tak, zdałem sobie sprawę, że :) Wdraż go teraz, dzięki – dylanmensaert
OK, wygląda na to, że robisz tylko płytki klon obiektu. Na przykład 'sudokuClone.Grid = (Field [,]) this.Grid' NIE wskazuje' sudokuClone.Grid' na nową kopię! –