【问题标题】:How to manually create a deep copy如何手动创建深拷贝
【发布时间】: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 themselves C# 不适用

标签: c# reference clone deep-copy


【解决方案1】:

看起来您正在到处创建对现有对象的引用,而不是创建副本。

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

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

【讨论】:

  • 嗯,在 SudokuAlgorithmNorvig 的构造函数中设置了 blockrows 和 blockcolumns。所以真的不知道如何克隆它。
  • Grid 是一个 Field 类型的二维数组(我以相同方式实现克隆的自定义类)。 Peers 和 Units 是哈希图,也由 Field 组成。那么我是否必须对 hashmap 和 array 做一些特殊的事情才能克隆?
  • 如果和Java一样,我相信所有的原语,int、double、char等都是按值传递的
猜你喜欢
  • 2011-08-18
  • 2013-04-06
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 2011-04-26
  • 1970-01-01
相关资源
最近更新 更多