c# – 如何手动创建深层副本

c# – 如何手动创建深层副本,第1张

概述关注此站点: http://www.csharp411.com/c-object-clone-wars/ 我决定手动创建我的课程的深层副本(在网站1.手动克隆之后).我实现了克隆接口和任何必要的属性.我执行了我的程序并检查了我的克隆是否确实与原始实例相同.这是对的. 但是,我的新实例仍然引用了原始实例.因此,我的副本中的任何更改都会反映到原始实例中. 因此,如果这不会创建一个深层副本,那么呢?什么 关注此站点: 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()

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

解决方法 看起来您正在创建对整个地方的现有对象的引用,而不是创建副本.

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

我不知道GrID,Peers和Units代表什么,但那些很可能也是引用.您还需要使所有这些类都可以克隆.否则,在SudokuAlgorithmnorvig类的第一个实例中更改GrID将更改第二个实例中的相应GrID.

总结

以上是内存溢出为你收集整理的c# – 如何手动创建深层副本全部内容,希望文章能够帮你解决c# – 如何手动创建深层副本所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1252546.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存