5

このサイトに従ってください: http://www.csharp411.com/c-object-clone-wars/

クラスのディープ コピーを手動で作成することにしました(次のサイト 1. Clone Manually)。クローン インターフェイスと必要なプロパティを実装しました。プログラムを実行し、クローンが元のインスタンスと本当に等しいかどうかを確認しました。これは正しかった。

ただし、新しいインスタンスはまだ元のインスタンスを参照しています。したがって、コピーの変更は元のインスタンスに反映されます。

これでディープ コピーが作成されない場合は、どうすればよいでしょうか。何がうまくいかなかったのでしょうか?

(パフォーマンスを向上させるために手動でディープ コピーを作成したいので、ObjectCopierクラスを使用したくありません。(うまく機能したとしても、コード実行時間の 90% を占めます) .

コード スニペット:

クラスは以下を実装します:

public class SudokuAlgorithmNorvig: ICloneable
{

クローン方法:

    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 メソッド呼び出し:

SudokuAlgorithmNorvig sudokuCopy = (SudokuAlgorithmNorvig)sudoku.Clone()

他のすべてのクラスで同じことを行いました(クローンメソッドの実装と設定)。( Field+ Coordinate)

4

1 に答える 1

3

コピーを作成するのではなく、既存のオブジェクトへの参照をあちこちに作成しているようです。

BlockRows新しいオブジェクトに渡すカスタム オブジェクトはありBlockColumnsますか? これらは単に既存のオブジェクトへの参照でBlockRowsありBlockColumns、最初のオブジェクトでこれらのインスタンスの 1 つを変更すると、2 番目のオブジェクトに反映されます。

GridPeers、およびが何を表しているかはわかりませんUnitsが、それらも参照になる可能性が高いです。これらのクラスもすべて複製可能にする必要があります。それ以外の場合、GridSudokuAlgorithmNorvig クラスの最初のインスタンスを変更するGridと、2 番目のインスタンスの対応するインスタンスが変更されます。

于 2013-03-18T22:34:06.573 に答える