c# - 如何手动创建深拷贝

标签 c# reference clone deep-copy

关注此站点:http://www.csharp411.com/c-object-clone-wars/

我决定手动创建我的类的深拷贝(以下站点 1。手动克隆)。我实现了克隆接口(interface)和任何必要的属性。我执行我的程序并检查我的克隆是否确实与原始实例相等。这是正确的。

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

因此,如果这没有创建深拷贝,那会怎样呢?可能出了什么问题?

(我想手动进行深拷贝以提高性能,所以我不想使用 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()

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

最佳答案

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

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

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

关于c# - 如何手动创建深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15488170/

相关文章:

c++ - 使用引用返回静态字符数组

jquery - 克隆 SVG 后的 SVG 过滤器

python - 如何克隆可迭代并递归替换特定值?

c# - 返回图像的 ASPX - 输出可缓存?

c# - 如何仅使用 C# 获取 SQL Server 数据库中的表列表以及主键?

c++ - 区分引用传递和值传递

c++ - 删除引用时双重释放或损坏

c# - Angularjs 和 WebAPI Put 方法参数始终为空

c# - 暴力破解性能: Java vs C#

javascript - 如何克隆和更改ID?