Иллюстрированный самоучитель по Visual Basic .NET

MemberWiseClone

В программировании, как и в современной науке:

  • Клоном называется точная копия объекта.
  • Состояние клона может измениться и стать отличным от состояния исходного объекта.

Но самое важное правило клонирования формулируется так:

  • Изменения в клоне не должны отражаться на исходном объекте, на основе которого клон создавался.

Примечание
Последнее обстоятельство затрудняет клонирование во всех языках ООП, поэтому метод MemberWiseClone считается потенциально опасным. Дело в том, что объект может содержать другие объекты. Если внутренние объекты не будут клонированы одновременно с объектом, их содержащим, вместо пары оригинал-клон вы получите сиамских близнецов, которые будут зависеть друг от друга. Если класс содержит поля, которые представляют собой изменяемые объекты, метод MemberWiseClone заведомо создает "сырой", неполноценный клон (это называется поверхностным копированием). Метод MemberWiseClone успешно клонирует только те объекты, поля которых относятся исключительно к структурным типам
.

Следующий пример наглядно показывает, что имеется в виду под этим предупреждением. Массивы VB.NET в отличие от массивов VB6 являются объектами.

Допустим, мы пытаемся клонировать объект класса, одно из полей которого представляет собой массив:

1 Public Class EmbeddedObjects
2 Private m_Data() As String
3 Public Sub New(ByVa1 anArray() As String)
4 m_Data = anArray
5 End Sub
6 Public Sub OisplayData()
7 Dim temp As String
8 For Each temp In m_Data
9 Console.WriteLine(temp)
10 Next
11 End Sub
12 Public Sub ChangeData(ByVal newData As String)
13 m_Data(0) = newData
14 End Sub
15 Public Function Clone() As EmbeddedObjects
16 Return CType(Me.MemberwiseClone. EmbeddedObjects)
17 End Function
18 End Class
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.