2015-06-09 6 views
3

Я пишу пользовательский класс, который реализует IDictionary, и я не уверен, что делать с CopyTo. Должен ли каждый элемент просто копироваться в целевой массив (мелкая копия), или я должен сделать копию/клон каждого элемента, а затем поместить его в целевой массив (глубокая копия)?Реализация ICollection.CopyTo в C#: глубокая или мелкая копия?

+1

Кому: КопитТо Вы намереваетесь? 'IEnumerable' не имеет метода' CopyTo'. –

+0

@JohnSaunders 'ICollection' делает, хотя, поскольку OP реализует' IDictionary', я подозреваю, что им нужно реализовать 'ICollection.CopyTo'. –

+0

Я подозреваю то же самое, но мы должны требовать точности, поскольку компьютеры делают именно то, что мы им говорим. –

ответ

5

Реализация не определена договором, однако все общие коллекции, по-видимому, выполняют мелкую копию (см. http://referencesource.microsoft.com/#q=List.CopyTo). Это имеет смысл, поскольку нет определенного способа глубоко скопировать любой object, который будет частью реализации CopyTo.

Это зависит от вашего сценария, если вы вообще не собираетесь использовать этот метод, подумайте о том, чтобы не реализовать его и выбросить NotSupportedException. Если другие будут использовать вашу коллекцию, выполните мелкую копию для выравнивания со стандартной библиотекой .NET. Если вам нужен метод глубокой копии, добавьте его как отдельный метод (возможно, путем реализации ICloneable).

Смежные вопросы