在数组上执行浅拷贝以调整大小的含义是什么?

时间:2009-01-11 09:59:53

标签: c# deep-copy shallow-copy

如果我对深度和浅层复制的理解是正确的,我的问题是不可能的。 如果你有一个数组(a [10])并执行浅拷贝(b [20])这不是不可能的,因为b中的数据不会是连续的吗?

如果我完全错了,有人会建议快速模仿(在c#中)c ++重新分配数组的能力。

注意
我正在查看System.Array对象的.Clone()和.Copy()成员。

1 个答案:

答案 0 :(得分:4)

您无法调整现有阵列的大小,但是,您可以使用:

Array.Resize(ref arr, newSize);

这会分配一个新数组,将旧数组中的数据复制到新数组中,并更新arr变量(在这种情况下由-ref传递)。这是你的意思吗?

但是,任何仍指向旧数组的其他引用都不会更新。更好的选择可能是使用List<T> - 然后您不需要手动调整它,并且您没有过时引用的问题。您只需Add / Remove等。通常,您不会经常直接使用数组。它们有它们的用途,但它们不是默认情况。


重新发表评论;

  • 拳击:List<T>没有框。这是关于仿制药的一点;在引擎盖下,List<T>T[]的包装,因此List<int>有一个int[] - 没有拳击。较旧的ArrayListobject[]的包装,因此框;当然,拳击isn't as bad as you might assume无论如何。
  • Array.Resize的运作; 如果我记得,它找到T的大小,然后使用Buffer.BlockCopy来显示内容实际细节被内部调用隐藏 - 但实质上是在分配了一个新数组之后它是两个数组之间数据的blit(memcpy),所以应该很快;请注意,对于引用类型,这仅复制引用,而不是堆上的对象。但是,如果您要定期调整大小,List<T>通常会更简单(并且更快,除非您基本上重新实现List<T>备用容量以最小化调整大小的数量。)