День сто тридцать первый. #ВопросыНаСобеседовании
Самые часто задаваемые вопросы на собеседовании по C#
15. В чем разница между Array.CopyTo() и Array.Clone()?
Метод
Однако есть различия и рекомендации по использованию этих методов.
System.Array.Clone:
1. Медленнее, чем
2. Требуется приведение результата к соответствующему типу;
3. Полученный массив имеет ту же длину, что и исходный.
System.Array.CopyTo:
1. Быстрее, чем Clone при копировании в массив того же типа;
2. Вызывает
- может вставлять элементы типа значения в элементы ссылочного типа, например, копируя массив
- может распаковывать элементы ссылочного типа в элементы значимого типа, например, копируя массив
- может выполнять расширенные преобразования для типов значений, например, копируя
- может выполнять даункаст элементов, например, копируя массив
- позволяет скопировать источник в целевой массив, длина которого больше, чем у источника.
Также обратите внимание, что эти методы доступны для реализации
Источник: - https://stackoverflow.com/questions/198496/difference-between-the-system-array-copyto-and-system-array-clone
Самые часто задаваемые вопросы на собеседовании по 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