【问题标题】:How may overlap happen when destination and source of CopyTo non-static method are the same array?当 CopyTo 非静态方法的目标和源是同一个数组时,如何可能发生重叠?
【发布时间】: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? 这可能毫无意义,是的。

标签: c# arrays


【解决方案1】:

CopyTo 调用归结为在array.cs 中调用Array.Copy。所以是的,这与that SO post 相同。

【讨论】:

  • 你读过这个问题吗?即使CopyTo 包装了Array.Copy,它也没有解释在使用实例方法CopyTo 时如何发生重叠。使用Array.Copy 可能会发生重叠,但在我的情况下似乎不正确。看来这本书是错误的。
  • 它解释了重叠如何不会发生。你显然已经得到了答案。问作者?
  • 我给出版商发了邮件。还没有收到任何答复。
猜你喜欢
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
相关资源
最近更新 更多