CopyTo () и Clone () делают мелкие копии. Метод Clone () создает клон исходного массива. Возвращает массив точной длины.
С другой стороны, CopyTo () копирует элементы из исходного массива в массив назначения, начиная с указанного индекса массива назначения. Обратите внимание, что это добавляет элементы к уже существующему массиву.
Следующий код будет противоречить сообщениям о том, что CopyTo () делает глубокую копию:
public class Test
{
public string s;
}
// Write Main() method and within it call test()
private void test()
{
Test[] array = new Test[1];
array[0] = new Test();
array[0].s = "ORIGINAL";
Test[] copy = new Test[1];
array.CopyTo(copy, 0);
// Next line displays "ORIGINAL"
MessageBox.Show("array[0].s = " + array[0].s);
copy[0].s = "CHANGED";
// Next line displays "CHANGED", showing that
// changing the copy also changes the original.
MessageBox.Show("array[0].s = " + array[0].s);
}
Позвольте мне объяснить это немного. Если элементы массива имеют ссылочные типы, то копия (как для Clone (), так и CopyTo ()) будет сделана до первого (верхнего) уровня. Но нижний уровень не копируется. Если нам также нужна копия более низкого уровня, мы должны сделать это явно. Вот почему после клонирования или копирования элементов ссылочного типа каждый элемент массива Cloned или Copied ссылается на ту же область памяти, на которую ссылается соответствующий элемент в исходном массиве. Это ясно указывает на то, что для нижнего уровня не создается отдельный экземпляр. И если бы это было так, то изменение значения любого элемента в массиве Копированный или Клонированный не имело бы эффекта в соответствующем элементе исходного массива.
Я думаю, что мое объяснение является исчерпывающим, но я не нашел другого способа сделать его понятным.