【问题标题】:In c# does Array.ToArray() perform a DEEP copy?在 c# 中,Array.ToArray() 是否执行深度复制?
【发布时间】:2012-05-10 08:57:04
【问题描述】:

这应该是一个非常基本的问题,但我一直很难找到一个明确的答案。

当您有一个值数组并使用.ToArray() 方法时,它会创建数组的深拷贝还是浅拷贝?

【问题讨论】:

  • 在我写了一个快速测试之前,我实际上是在互联网上寻找答案(这不像谷歌搜索那么快)。我认为这个问题的评分为 -1 的原因仅仅是因为您在深拷贝、浅拷贝和对象引用(您可能指的是浅拷贝)之间存在误解。

标签: c# arrays deep-copy shallow-copy toarray


【解决方案1】:

没有。

您可以通过编写一个小程序进行测试来轻松验证这一点。

【讨论】:

  • +1。请注意,如果它是结构数组,它将复制值(仍然是浅拷贝)。
  • 我刚刚创建了一个包含 3 个元素的 string[] 的小程序,然后我使用 = origArray.ToArray() 创建了一个新数组,然后更改了新数组中的一个元素并打印出来两个数组和它们在哪里不同,这是否意味着它是一个深拷贝?我在看什么?
  • 在 C# 中没有内置方法可以进行深度复制,因此您对“深度”的定义可能不寻常。考虑提出新问题“什么是深拷贝,这是我的理解......”(不要忘记清楚地解释你是如何理解它的,以便其他人可以确认/评论你的理解的哪一部分是错误的或非传统的) .
  • @hrh 您的测试显示它所做的事情的原因是 C# 中的字符串是不可变的-您实际上所做的是将新字符串重新分配给另一个数组中该索引处的元素-以测试深拷贝用引用类型变量创建你自己的类的数组,然后在一个数组中的一个元素上修改该变量,你会看到你在两个数组中都修改了它
  • 这个答案可以使用更多的解释和细节
【解决方案2】:

严格来说,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

【讨论】:

    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 2013-12-03
    • 2015-02-28
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多