Зачем использовать Clone()?

Какова основная цель использования Clone() в C#?

В чем выгода его использования?

3 ответа

Решение

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

Например:

void Test(ICloneable original)
{
    var cloned = original.Clone();
}

Вот cloned имеет тот же тип времени выполнения, что и originalи вам не нужно было знать, что это за тип, чтобы выполнить клонирование.

Однако полезность ICloneable почти ничего, потому что он не определяет семантику операции клонирования: это мелкая копия или глубокая копия? Поскольку интерфейс не требует ни того, ни другого, вы не можете точно знать, что вы получаете. А так как знание этого важно, потому что вам нужно обращаться с клоном соответственно, ICloneable Сама по себе сожженная карта.

Определение вашего собственного интерфейса с Clone Метод (с четко определенной семантикой) имеет большой смысл.

Обновление: См. Также: Почему я должен реализовать ICloneable в C#?

Clone() обычно предоставляет поверхностную копию объекта (т.е. см. Array.Clone ()), он копирует ссылки, но не ссылающиеся объекты.

Это удобно, если вы понимаете его ограничения, в основном потому, что семантика того, что на самом деле копируется в новый объект, по большей части оставлена ​​на усмотрение разработчика. Clone() метод, потому что интерфейс ICloneable это определяет the Clone() метод не указан (так что это может быть поверхностная или глубокая копия, но на нее нельзя полагаться).

Когда мы копируем содержимое объекта в другой (SomeClass obj2 = obj1), obj2, также принадлежащий к тому же классу, изменяя содержимое obj2, также будет изменять содержимое obj1. Это потому, что они являются ссылочными типами. Использование Clone() (надлежащим образом) может избежать этого. При модификации клонированного объекта оригинал не будет изменен.

Другие вопросы по тегам