Зачем использовать 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() (надлежащим образом) может избежать этого. При модификации клонированного объекта оригинал не будет изменен.