实现ICloneable接口C#(深度克隆)

我在看实现 ICloneable 的一个类的接口。

该类如下。

public class TempClass
{
  String[] names;
  String[] values;
}

创建了一个部分类,实现了 TempClass

public partial class TempClass:ICloneable
{
   public Object Clone()
   {
      TempClass cloneClass = new TempClass();
      String[] cloneNames = new String[this.names.Length - 1];
      String[] cloneValues = new String[this.values.Length -1];

      Array.Copy(this.names,cloneNames,this.names.Length);
      Array.Copy(this.values,cloneValues,this.values.Length);

      cloneClass.names = cloneNames;
      cloneValues.values = cloneValues;

      return cloneClass;
   }
}

我想知道这是否是对一个对象进行深度复制的有效方法?在这里引起注意的是中间结构 cloneNamescloneValues 用于复制原始对象的值,并具有成员变量的 Names 和 Values指向它,然后返回在clone方法中创建的对象引用。

如果有任何关于这段代码的反馈,我们将不胜感激。

谢谢你

解决方案:

Array.CloneArray.Copy 都会创建浅层副本(如链接的API文档中所述),但使用字符串数组会使问题变得模糊,因为字符串在.NET中是不可变的。当你这样做的时候。

stringArray[0] = "first value";
stringArray[0] = "second value";

第一个字符串实例会被一个不同的实例所取代,所以看起来你已经做了一个深层拷贝(对于字符串数组,你可能已经做了)。

要对一个具有普通引用类型的数组的对象进行深度复制,你需要为数组元素创建新的实例。比如说 TempClass 储存了一个 Cookie 对象而不是字符串。

public Object Clone() {
    TempClass clone = new TempClass();

    clone.cookieArray = new Cookie[this.cookieArray.Length];
    for(int i = 0; i < this.cookieArray.Length; i++) {
        Cookie cookie  = this.cookieArray[i];
        clone.cookieArray[i] = new Cookie(cookie.Name, cookie.Value, cookie.Path, cookie.Domain);
    }
}

本文来自投稿,不代表实战宝典立场,如若转载,请注明出处:https://www.shizhanbaodian.com/27825.html

(0)
上一篇 1天前
下一篇 1天前

相关推荐

发表评论

登录后才能评论