在C#中实现ICollection.CopyTo:深拷贝还是浅拷贝?

4

我正在编写一个自定义类,它实现了IDictionary接口,但是我不确定该如何处理CopyTo方法。应该将每个元素仅复制到目标数组中(浅复制),还是应该对每个元素进行复制/克隆然后将其放入目标数组中(深度复制)?


1
你指的是哪个 CopyTo 方法?IEnumerable 没有 CopyTo 方法。 - John Saunders
@JohnSaunders ICollection 也需要实现,由于 OP 正在实现 IDictionary,我猜他们需要实现 ICollection.CopyTo - Asad Saeeduddin
我也有同样的怀疑,但我们应该要求精确,因为计算机会完全按照我们所告诉它们的去执行。 - John Saunders
请参见 https://msdn.microsoft.com/zh-cn/library/system.collections.dictionarybase.copyto.aspx。更好的选择是,请参见 https://msdn.microsoft.com/zh-cn/library/cc645053.aspx。 - John Saunders
1
始终针对IDictionary浅拷贝。因为元素的类型是object,你无法知道如何进行深拷贝。 - Enigmativity
显示剩余3条评论
1个回答

5
实现并未由合同定义,然而所有通用集合似乎都会进行浅复制(请参见http://referencesource.microsoft.com/#q=List.CopyTo)。这是有道理的,因为没有定义任何深度复制object的方法,这也将是CopyTo实现的一部分。
这取决于您的场景,如果您根本不打算使用此方法,请考虑不实现它并抛出NotSupportedException。如果其他人将使用您的集合,请实现浅复制以与标准.NET库对齐。如果您需要一个深度复制方法,请将其作为单独的方法添加(可能通过实现ICloneable)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接