C# 更改以前分配的值 [duplicate]

C# changing previously assigned values [duplicate]

提问人:Nila 提问时间:4/28/2021 最后编辑:Jonas WNila 更新时间:4/28/2021 访问量:69

问:

我有一个函数,可以在二维数组“a”上调用并更改数组。但是,它甚至在调用函数之前也会更改以前分配给“a”的任何数组。我不确定我是否明白为什么!

char[][] copy;

copy = a; // a is a also a two dimensional char array

DFSfunction(a); //DFSfunction alters values of a

因此,在调用 DFSfunction 后,“copy”的值也会更改。我怎样才能保留原始“a”的副本?

谢谢!

C# 按值调用

评论

1赞 mjwills 4/28/2021
在传入数组之前克隆数组。
0赞 phuclv 4/28/2021
做一个深度复制,这是用 h geeksforgeeks.org/shallow-copy-and-deep-copy-in-c-sharp 实现的Array.Clone
2赞 mjwills 4/28/2021
从技术上讲,克隆会做一个浅层复制 - 但对于字符@phuclv来说就足够了。

答:

2赞 Jonas W 4/28/2021 #1

数组在 C# 中是可变的,因此如果您在示例中更改 a,它也会对复制产生影响,因为它们仍然具有相同的引用

所以当你写

copy = a

copy只是指向同一个数组。a

要解决这个问题,您可以使用 Array.Copy.

在您的示例中,它可能看起来像这样:

char[][] copy;
char[][] a;

Array.Copy(a, copy, a.Length);

您还可以使用 Array.Clone

var copy = (char[][])a.Clone();

评论

0赞 Nila 4/28/2021
不幸的是,克隆不起作用,和以前一样的事情正在发生。
0赞 Nila 4/28/2021
我无法让 Arary.Copy 工作,说必须先初始化副本。
0赞 mjwills 4/28/2021
@Nila 将克隆传入方法 - 不要传入 。a
0赞 Mauricio Gracia Gutierrez 4/29/2021
A[] Array2 = Array.ConvertAll(Array1,a => (A)a.Clone());- stackoverflow.com/questions/3464635/deep-copy-with-array