【发布时间】:2013-03-07 11:01:15
【问题描述】:
关注本站: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)
【问题讨论】:
-
我们有点需要看看你的代码,看看哪里出了问题。展示问题的最短代码示例将是最好的。
-
是的,意识到 :) 现在实施,谢谢
-
好吧,看起来你只是在做对象的浅层克隆。例如,
sudokuClone.Grid = (Field[,])this.Grid没有将sudokuClone.Grid指向新副本! -
我不确定,因为它是 C#,但如果它像 Java,因为您将所有对象(字段、对等点、单元)分配给克隆,它们是通过引用传递的。您需要 new 运算符为每个对象创建深层副本,这就是为什么大多数对象都有一个带有自身类型参数的构造函数。
-
@SGM
that's why must objects have a constructor with parameter of type themselvesC# 不适用
标签: c# reference clone deep-copy