关注此网站: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
)
答案 0 :(得分:3)
看起来您正在创建对整个地方的现有对象的引用,而不是创建副本。
您传递到新对象的BlockRows
和BlockColumns
个自定义对象?这些只是在现有对象中引用BlockRows
和BlockColumns
,因此在第一个对象中更改其中一个实例将反映在第二个对象中。
我不知道Grid
,Peers
和Units
代表什么,但那些也很可能是参考。您还需要使所有这些类都可以克隆。否则,在SudokuAlgorithmNorvig类的第一个实例中更改Grid
将更改第二个实例中的相应Grid
。