День сто тридцать первый. #ВопросыНаСобеседовании

Самые часто задаваемые вопросы на собеседовании по C#

15. В чем разница между Array.CopyTo() и Array.Clone()?

Метод Clone() возвращает новый объект массива (неглубокая копия), содержащий все элементы в исходном массиве. Метод CopyTo() копирует элементы в другой существующий массив. Оба выполняют неглубокое копирование, то есть каждый элемент массива будет содержать ссылки на те же объекты, что и элементы в исходном массиве. Глубокая копия (которую не выполняет ни один из этих методов) создаёт новый экземпляр объекта каждого элемента, в результате чего получится другой, но идентичный объект.

Однако есть различия и рекомендации по использованию этих методов.

System.Array.Clone:

1. Медленнее, чем CopyTo, вероятно, потому что использует Object.MemberwiseClone;

2. Требуется приведение результата к соответствующему типу;

3. Полученный массив имеет ту же длину, что и исходный.



System.Array.CopyTo:

1. Быстрее, чем Clone при копировании в массив того же типа;

2. Вызывает Array.Copy, наследуя некоторые его полезные возможности:

- может вставлять элементы типа значения в элементы ссылочного типа, например, копируя массив int[] в object[];

- может распаковывать элементы ссылочного типа в элементы значимого типа, например, копируя массив object[] из упакованных элементов int в массив int[];

- может выполнять расширенные преобразования для типов значений, например, копируя int[] в long[];

- может выполнять даункаст элементов, например, копируя массив Stream[] в MemoryStream[] (если какой-либо элемент в исходном массиве не конвертируется в MemoryStream, генерируется исключение);

- позволяет скопировать источник в целевой массив, длина которого больше, чем у источника.



Также обратите внимание, что эти методы доступны для реализации ICloneable и ICollection. Поэтому, если вы имеете дело с массивами, вам не следует использовать Clone или CopyTo, а вместо этого использовать Array.Copy или Array.ConstrainedCopy. Ограниченная копия гарантирует, что если операция копирования завершится неудачей, то состояние целевого массива не будет повреждено.



Источник: - https://stackoverflow.com/questions/198496/difference-between-the-system-array-copyto-and-system-array-clone