在c#中,Array.ToArray()执行DEEP拷贝吗?

hrh*_*hrh 6 c# arrays deep-copy shallow-copy toarray

这应该是一个非常基本的问题,但我找到一个明确的答案时遇到了一些麻烦.

如果您有一个值数组并且使用该.ToArray()方法,它是否会创建数组的深层或浅层副本?

Dom*_*nic 13

没有.

您可以通过编写一个小程序来轻松验证这一点.

  • 这个答案需要更多的解释和细节 (3认同)
  • 没有内置的方法可以在C#中进行深层复制,因此您对"深层"的定义可能并不常见.考虑问一个新问题"什么是深层复制,这是我的理解......"(不要忘记清楚地解释你如何理解它,以便其他人可以确认/评论你理解的哪个部分是错误的或非传统的) . (2认同)
  • @hrh你的测试显示它做了什么的原因是C#中的字符串是不可变的 - 你实际做的是将新字符串重新分配给另一个数组中该索引处的元素 - 测试深层副本创建自己的数组具有引用类型变量的类然后在一个数组中的一个元素上修改该变量,您将看到在两个数组中修改它 (2认同)

Cer*_*vEd 7

严格来说,ICollection.ToArray()创建一个新数组T[]并将原始集合中的每个元素分配给新数组Array.CopyTo()

笔记:

如果T是值类型,则分配值而不是引用。这将表现出人们对“深层”副本的期望。

int[] foo = { 1, 2, 3, 4 };
int[] bar = foo.ToArray();

for (int i = 0; i < foo.Length; i++) foo[i] += 10;

Console.WriteLine(string.Join(',', foo)); // 11, 12, 13, 14
Console.WriteLine(string.Join(',', bar)); // 1, 2, 3, 4
Run Code Online (Sandbox Code Playgroud)