按照这个网站http://www.csharp411.com/c-object-clone-wars/的方法,我决定手动创建一个类的深度拷贝(遵循第一种方法:手动克隆)。我实现了克隆接口和必要的属性。我运行程序并检查我的克隆是否与原始实例相等。这是正确的。
然而,我的新实例仍然引用原始实例。所以在我的副本中进行的任何更改都会反映到原始实例中。
那么如果这不会创建深度拷贝,那么什么会呢?出了什么问题吗?
(我想手动制作深度拷贝以提高性能,所以我不想使用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
)
sudokuClone.Grid = (Field[,])this.Grid
并没有将sudokuClone.Grid
指向一个新的副本! - Matthew Watson