【问题标题】:Implementing ICollection.CopyTo in C#: deep or shallow copy?在 C# 中实现 ICollection.CopyTo:深拷贝还是浅拷贝?
【发布时间】:2015-08-23 16:21:44
【问题描述】:

我正在编写一个实现IDictionary 的自定义类,但我不确定如何处理CopyTo。应该将每个元素都复制到目标数组(浅拷贝),还是应该复制/克隆每个元素,然后将其放入目标数组(深拷贝)?

【问题讨论】:

  • 你指的是哪个CopyToIEnumerable 没有 CopyTo 方法。
  • @JohnSaunders ICollection 确实如此,而且由于 OP 正在实施 IDictionary,我怀疑他们需要实施 ICollection.CopyTo
  • 我怀疑是一样的,但我们应该要求精确,因为计算机完全按照我们告诉它们做的事情。
  • 啊,哎呀!对于那个很抱歉。我将编辑问题...
  • 对于IDictionary 总是很浅。由于元素的类型为object,因此您无法知道如何进行深层复制。

标签: c# copy clone interface-implementation


【解决方案1】:

合约没有定义实现,但是所有通用集合似乎都做了一个浅拷贝(参见http://referencesource.microsoft.com/#q=List.CopyTo)。这是有道理的,因为没有明确的方法可以深度复制任何 object,这将是 CopyTo 实现的一部分。

这取决于您的情况,如果您根本不打算使用此方法,请考虑不实施它并抛出NotSupportedException。如果其他人将使用您的集合,请实施浅拷贝以与标准 .NET 库保持一致。如果您需要深拷贝方法,请将其添加为单独的方法,(可能通过实现 ICloneable)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2013-08-23
    相关资源
    最近更新 更多