Я знаю, что CopyTo требует наличия целевого массива, в то время как Clone возвращает новый массив. но я читал, что оба выполняют неглубокую копию и ссылаются на один и тот же экземпляр ..

Так что если у меня есть

A = [1,2,3,4] 

И я Clone это и получаю

B = [1,2,3,4].

Теперь, если я изменю

B[0] = 9.

Это означает, что теперь A будет

A = [9,2,3,4].

Это верно? И это правильно для CopytTo()?

0
juhi 18 Мар 2014 в 08:49
5
Почему бы тебе не попробовать? на попытку уйдет меньше времени, чем на ожидание ответа.
 – 
Ehsan
18 Мар 2014 в 08:51
Вы пробовали? Если у вас есть под рукой Visual Studio, вы можете написать короткий фрагмент кода и получить ответ через пару минут.
 – 
Tim
18 Мар 2014 в 08:51

3 ответа

Лучший ответ

Когда вы выполняете B[0] = 9, вы заменяете элемент индексом 0 в массиве B, поэтому массив A останется прежним (на самом деле вы не меняете его), и не имеет значения, какой метод (CopyTo или Clone), который вы используете (поскольку A не ссылается на B).

1
Tony 18 Мар 2014 в 08:57
Так что если я изменю массив A, то соответственно изменится B или нет?
 – 
juhi
18 Мар 2014 в 09:01
1
Если вы Clone или CopyTo, то B не изменится, поскольку они ссылаются на два разных адреса памяти.
 – 
vbn
18 Мар 2014 в 09:06

Нет. Clone обычно создает новый экземпляр и копирует в него все, что есть в исходном объекте. Другими словами, A и B указывают на два разных воспоминания. В вашем случае A останется нетронутым.

A = [1, 2, 3, 4]

A будет изменен, только если мы установим

B = A;

В этом случае и A, и B указывают на один и тот же адрес.

Однако если мы установим

B = A.Clone();

Тогда любые изменения, внесенные в B, не повлияют на A. CopyTo также выполняет тот же процесс, что и Clone, за исключением того, что позволяет вам указать позицию в A, чтобы начать копирование данных в B.

1
vbn 18 Мар 2014 в 09:02

Документация MSDN для Array.Clone специально рассматривает этот пример, чтобы показать, что нет, он не изменит обе копии.

Это имеет смысл, поскольку объект массива будет серией адресов памяти, указывающих на объект. Когда вы клонируете массив, вы создаете копию адресов памяти. Если вы измените один из массивов, вы измените значение адреса памяти. Следовательно, изменение будет внесено в этот массив.

http://msdn.microsoft.com/en-us/library/system.array.clone(v=vs.110).aspx

0
SeeMoreGain 18 Мар 2014 в 09:02