Клонирование фактически копирует данные объекта в новый объект.
Этот пример не клонирует данные:
Foo p = new Foo();
Foo o = p;
Если Foo
имеет член a
, и вы изменили p.a
, то o.a
также изменится, поскольку и p
, и o
указывают на один и тот же объект.
Тем не менее,
Foo p = new Foo();
Foo o = p.Clone();
В этом случае, если вы измените p.a
, то o.a
останется прежним, потому что они фактически указывают на отдельные объекты.
Существует два способа клонирования: неглубокий клон или глубокий клон.
Мелкий клон просто создает новый объект и копирует членов в новый объект. Это означает, что если один из членов фактически является указателем на другой объект, то этот объект будет разделен между старым объектом и новым объектом.
Глубокий клон фактически проходит и клонирует всех участников в новый объект. Таким образом, объекты являются полными копиями всех данных.