用数组深度复制一个类[重复]

Posted

技术标签:

【中文标题】用数组深度复制一个类[重复]【英文标题】:Deep copy a class with arrays [duplicate] 【发布时间】:2020-07-28 20:27:44 【问题描述】:

这是我询问关于复制课程的previous question 的附录。

上一个问题(复制类而不是引用类型)的基本答案是使用memberwise clone 方法来避免保持两个类之间的链接。

在只有 int 值的类上这样做是可行的,但是一旦我在混合中引入数组,这就会崩溃。见脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyClass

    public int[] myNumber;

    public MyClass ShallowCopy()
    
        return (MyClass)this.MemberwiseClone();
    


public class Test : MonoBehaviour

    Dictionary<string, MyClass> myDictionary1 = new Dictionary<string, MyClass>();
    Dictionary<string, MyClass> myDictionary2 = new Dictionary<string, MyClass>();

    void Start()
    
        myDictionary1.Add("a", new MyClass()  myNumber = new int[]  1, 1  );
        myDictionary1.Add("b", new MyClass()  myNumber = new int[]  2, 2  );

        myDictionary2["b"] = myDictionary1["a"].ShallowCopy();
        myDictionary2["b"].myNumber[0] = 3;

        Debug.Log(myDictionary1["a"].myNumber[0]); //output 3, I'd want it to still be 1
    

我尝试过实现 ShallowCopy 方法(在第 9 行实现并在第 25 行使用),但它不起作用。我应该实现一个 DeepCopy 方法,但我不知道如何将其应用于数组。

我的新 DeepCopy 函数类似于

public MyClass DeepCopy()

    MyClass other = (MyClass)this.MemberwiseClone();
    other.myNumber = ?????????????????????? //int[] deep copy
    return other;

但我不知道如何制定数组的副本。我找到了一个 similar thread 来处理这个问题,但我无法根据我的情况调整解决方案。

提前致谢!

【问题讨论】:

other.myNumber = myNumber.ToArray()? 谢谢,但不幸的是它不起作用 “它不起作用”是什么意思? 我试过了,找不到ToArray方法。我在 Visual Studio for Unity 上使用 C#。 您需要在 using 子句中添加using System.Linq; 【参考方案1】:

如果你知道你的数组将充满像 int 这样的值类型,或者你有引用类型并且你希望两个数组都引用同一个实例,你可以使用CopyTo

int[] copyTarget = new int[copyFrom.length];
copyFrom.CopyTo(copyTarget, 0);

如果您的数组中可以/确实有引用类型,并且您不希望新数组引用相同的实例,则您将不得不遍历元素,对每个元素进行逐个克隆:

int[] copyTarget = new int[copyFrom.length];
for(int i = 0; i < copyTarget.Length; i++)

    copyTarget[i] = copyFrom[i].MemberwiseClone();

【讨论】:

我已经测试了这两种方法,但都不起作用。无论如何感谢您的回复! 什么都不工作是什么意思?

以上是关于用数组深度复制一个类[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java数组去重复问题

如何在java中深度复制对象。该对象可能是也可能不是可序列化的[重复]

对象/数组的深度比较[重复]

写时复制会防止阵列上的数据重复吗?

写时复制会防止阵列上的数据重复吗?

如何在不替换 ES6/Javascript 中的整个属性的情况下深度复制对象 [重复]