C# MemberwiseClone vs ICloneable (Clone)


#1

Какая разница между методом MemberwiseClone реализованном в Object и методом Clone из интерфейса ICloneable, который реализован в различных классах/структурах ,Net платформы? Что лучше использовать и когда?


#2

MemberwiseClone делает поверхностную копию, он копирует состояние объекта из одной части памяти в другую, поэтому классы по древу наследования объекта для клонирования склонируются полностью и для них будут новые экземпляры, а вот внутренние члены (поля) останутся теми же и в клон подставятся ссылки на уже существующие объекты, а не создадутся новые. Поэтому изменения введённые в состоянии клона отразятся и на оригинале, и наоборот.

По задумке метод Clone из интерфейса ICloneable должен делать глубокое клонирование и создавать новые экземпляры как самого объекта (включая классы от которых он наследуется) так и новые экземпляры полей описывающих его состояние. Всё это делается через конструктора. Изменения внесённые в клоне позже никак не отразятся на оригинале, но после копирования их состояние будет одинаковым.

Поскольку Clone использует конструктора при создании, то он затрачивает больше времени (где раз в 10 или больше) на копирование нежели MemberwiseClone, но от этого присутствует свой плюс описанный выше.

Исходя из этих отличий и нужно подстраиваться под различные ситуации.


#3

спасибо