c# - 用数组深拷贝一个类
问题描述
这是我之前询问的关于复制课程的问题的附录。
上一个问题(复制类而不是引用类型)的基本答案是使用按成员克隆方法来避免保持两个类之间的链接。
在只有 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;
}
但我不知道如何制定数组的副本。我发现了一个类似的线程来处理这个问题,但我无法根据我的情况调整解决方案。
提前致谢!
解决方案
如果您知道您的数组将充满像 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();
}
推荐阅读
- swiftui - 根据屏幕宽度制作 2x2 网格
- node.js - 管理员 Angular 仪表板 我需要什么
- design-patterns - 在两个视图模型之间颤动交换数据
- c++ - CPP Main 中的 CUDA 常量内存使用情况
- html - 使用 CSS 网格在移动设备的顶部和底部拆分侧边栏
- javascript - Highcharts Annotation SVG 不随其他形状移动
- python-3.x - 在 docker 容器内安装 openpose - dockerfile 的安装问题
- c# - 谷歌图表与 asp.net MCV
- python - 提取两个字符串之间的差异
- javascript - 联系表格未解析所有字段