Я знаю, что CopyTo
требует наличия целевого массива, в то время как Clone
возвращает новый массив. но я читал, что оба выполняют неглубокую копию и ссылаются на один и тот же экземпляр ..
Так что если у меня есть
A = [1,2,3,4]
И я Clone
это и получаю
B = [1,2,3,4].
Теперь, если я изменю
B[0] = 9.
Это означает, что теперь A будет
A = [9,2,3,4].
Это верно? И это правильно для CopytTo()
?
3 ответа
Когда вы выполняете B[0] = 9
, вы заменяете элемент индексом 0 в массиве B
, поэтому массив A
останется прежним (на самом деле вы не меняете его), и не имеет значения, какой метод (CopyTo
или Clone
), который вы используете (поскольку A
не ссылается на B
).
Clone
или CopyTo
, то B не изменится, поскольку они ссылаются на два разных адреса памяти.
Нет. Clone
обычно создает новый экземпляр и копирует в него все, что есть в исходном объекте. Другими словами, A и B указывают на два разных воспоминания. В вашем случае A останется нетронутым.
A = [1, 2, 3, 4]
A будет изменен, только если мы установим
B = A;
В этом случае и A, и B указывают на один и тот же адрес.
Однако если мы установим
B = A.Clone();
Тогда любые изменения, внесенные в B, не повлияют на A. CopyTo
также выполняет тот же процесс, что и Clone
, за исключением того, что позволяет вам указать позицию в A, чтобы начать копирование данных в B.
Документация MSDN для Array.Clone
специально рассматривает этот пример, чтобы показать, что нет, он не изменит обе копии.
Это имеет смысл, поскольку объект массива будет серией адресов памяти, указывающих на объект. Когда вы клонируете массив, вы создаете копию адресов памяти. Если вы измените один из массивов, вы измените значение адреса памяти. Следовательно, изменение будет внесено в этот массив.
http://msdn.microsoft.com/en-us/library/system.array.clone(v=vs.110).aspx
Похожие вопросы
Новые вопросы
.net
НЕ используйте для вопросов о .NET Core - используйте вместо этого [.net-core]. .NET Framework - это программная среда, предназначенная главным образом для операционной системы Microsoft Windows. Он включает в себя реализацию библиотеки базовых классов, общеязыковой среды выполнения (обычно называемой CLR), общей системы типов (обычно называемой CTS) и динамической среды исполнения. Он поддерживает множество языков программирования, включая C #, VB.NET, F # и C ++ / CLI.