5

关注本网站:http ://www.csharp411.com/c-object-clone-wars/

我决定手动创建我的课程的深层副本(在站点 1. 手动克隆之后)。我实现了克隆接口和任何必要的属性。我执行了我的程序并检查了我的克隆是否确实与原始实例相同。这是正确的。

但是,我的新实例仍然引用了原始实例。因此,我的副本中的任何更改都会反映到原始实例中。

因此,如果这不会创建深层副本,那又会怎样呢?可能出了什么问题?

(我想手动做一个深拷贝来提高我的性能,所以我不想使用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;
    }

克隆方法调用:

SudokuAlgorithmNorvig sudokuCopy = (SudokuAlgorithmNorvig)sudoku.Clone()

我在所有其他类中都做了同样的事情(实现和设置克隆方法)。( Field+ Coordinate)

4

1 回答 1

3

看起来您正在整个地方创建对现有对象的引用,而不是创建副本。

您是否将BlockRowsBlockColumns定义对象传递给新对象?这些只是对现有对象的引用BlockRowsBlockColumns因此在第一个对象中更改其中一个实例将反映在第二个对象中。

我不知道Grid,PeersUnits代表什么,但这些也很可能是参考。您还需要使所有这些类都可克隆。否则,更改GridSudokuAlgorithmNorvig 类的第一个实例将更改Grid第二个实例中的对应项。

于 2013-03-18T22:34:06.573 回答