【发布时间】:2020-09-11 12:44:19
【问题描述】:
在Programming C# 5 书中,我读到:
Array类除了静态的Copy方法外,还定义了一个非静态的CopyTo方法,它将整个数组复制到一个目标数组中,开始 在指定的偏移量。存在此方法是因为所有数组都实现了某些集合接口,包括 ICollection(其中 T 是数组的元素类型),它定义了这个 CopyTo 方法。 复制 To 不保证正确处理重叠,并且文档 建议在您熟悉的场景中使用 Array.Copy 将处理数组——CopyTo 只是为了通用目的 可以与集合的任何实现一起使用的代码 界面。
它表示使用CopyTo 非静态方法时无法正确处理重叠。问题是我认为当我们在数组上使用 CopyTo 时可能会发生 no 重叠!因为,它试图将 整个 数组复制到目的地。如果目标与源相同,则目标与源大小相同,因此,我们可以复制到的唯一位置是0(我的意思是第二个参数必须为零:myArray.CopyTo(myArray, 0)),因此,每个元素都是在已经存在的索引处复制。那么这本书所说的重叠问题是什么?
我所说的都可以在下面的代码中看到:
> var a = new int[] { 1, 2, 3 };
> a
int[3] { 1, 2, 3 }
> a.CopyTo(a, 0) // this is the only way I can call this method without
// getting error, If I want to pass the same array as first argument
> a
int[3] { 1, 2, 3 } // nothing went wrong! What is to worry about?
除了我所说的之外,为什么有人可以在索引 0 处将数组复制到自身中?这样做有什么意义?我错过了什么?
请注意,这与this SO post 不是同一个问题。那个 SO 帖子是关于 Copy mehtod,而不是 CopyTo。
我认为在处理数组时所有关于重叠的考虑,只有在我们将数组传递给Copy() 时才有意义。如该 SO 帖子中所述。
【问题讨论】:
-
那么,将数组复制到自身有什么意义呢?你可以看看
Array.Copy的实现,它是通过内部调用完成的 -
@PavelAnikhouski Array.Copy 能够将数组的子集复制到自身,并且它有很多用例!我在问 Array.CopyTo 它将整个数组复制到自身!正在更改数组!
-
这是你的问题
var a = new int[] { 1, 2, 3 }创建一个长度为 3 的数组。如果你执行a.CopyTo(a, 0)它开始将a的条目写入到a从索引 0 开始。所以你结束向上写入 3 个项目到索引 0,1,2。但是,如果您尝试类似a.CopyTo(a, 1)这意味着将a的元素复制到a从索引1 开始该过程,现在您需要a中的4 个元素来执行此操作,而您没有。你只有 3 个。 -
好像书错了
-
why may someone copy an array into itself at index 0?这可能毫无意义,是的。