Зачем использовать Clone ()? - PullRequest
4 голосов
/ 26 марта 2011

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

Какая польза от его использования?

Ответы [ 3 ]

16 голосов
/ 26 марта 2011

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

Например:

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

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

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

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

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

3 голосов
/ 26 марта 2011

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

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

0 голосов
/ 13 февраля 2015

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

...