gpt4 book ai didi

c# - 深度复制引用类型

转载 作者:太空宇宙 更新时间:2023-11-03 20:43:40 25 4
gpt4 key购买 nike

我正在使用一个名为 BigNumDesc 的类来表示数字。我有一个锯齿状的数字数组,代表一个矩阵。我首先通过以下方式声明此矩阵:

    BigNumDec[][] matrix = new BigNumDec[][] {
new BigNumDec[] { 1, 2 },
new BigNumDec[] { 3, 4 }
};

现在,我要调用这个方法:

static BigNumDec[][] GetStrictlyUpperTriangle(BigNumDec[][] matrix)
{
BigNumDec[][] newMatrix = new BigNumDec[matrix.Length][];
matrix.CopyTo(newMatrix, 0);
return null;
}

我在最后一行有一个断点。如果在监 window 口中,我获取矩阵的任何项并对其进行更改,它也会更改为新矩阵,因为所有 BigNumDec 都是引用类型(它的创建者的错误设计决定?)。我怎样才能做到这一点?我需要对 newMatrix 进行修改,所以我必须先从 matrix 复制它。

编辑:现在对整数进行了同样的尝试,但结果还是一样。我希望它不会发生在值类型上吗?

BigNumDec 是不可变的。

最佳答案

值类型仍然发生这种情况的原因是因为您使用的是数组数组。您正在浅复制“外部”数组,它只是复制对两个“内部”数组的引用。

您还没有显示 BigNumDec 是否是不可变的(我希望如此),但如果是,如果您只是深度复制数组应该没问题。或者,您能否使用矩形数组 [,] 而不是锯齿状数组 [][]?如果是这样,一个简单的副本就足够了。请注意,矩形阵列对性能有影响 - 值得对此进行测试,看看它是否会对您造成问题。您获得了更好的引用位置,但实际的数组访问速度没有那么快。

关于c# - 深度复制引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1611859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com