Далее мы обсудим проблемы с ICloneable и поговорим о лучшей альтернативе на C#.

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

Каковы основные проблемы с ICloneable?

1. Внедрение занимает много времени: если у вас есть глубокая иерархия объектов, вам придется создать множество реализаций интерфейса и логику глубокого копирования для каждого члена.

2.Неоднозначная спецификация: метод Clone() не требуется для реализации стратегии глубокого копирования, поэтому неясно, реализован ли клон как глубокая или поверхностная копия.

Если вы не знаете, чем отличается глубокая копия от поверхностной, посмотрите мою статью на эту тему здесь.

3. Ненужное приведение: метод ICloneable Clone() возвращает слабо типизированный объект, которыйтребует обратного приведения к исходному более сильному типу.

Упрощенное решение

Один из самых простых способов создать полный глубокий клон — сериализовать объект, а затем десериализовать его обратно в новый объект. Для этого можно использовать встроенный-сериализатор JSON или пакет Microsoft.AspNetCore.Mvc.NewtonsoftJson Nuget, как в следующем примере.

Использование NewtonsoftJson с методом расширения:

Использование в том же пространстве имен:

Заключение

Сериализация и десериализация объекта — отличный способ создать клон, поскольку при этом автоматически создается глубокая копия объекта. Кроме того, его гибко реализовать. Вы можете использовать форматирование двоичных файлов, XML или JSON и т. д. Кроме того, он не требует никакого интерфейса.

Конечно, этот подход также не идеален. Это может вызвать проблемы с производительностью и ошибки времени выполнения, если объект нельзя легко сериализовать/десериализовать.

Привет, ребята, меня зовут Роланд, и я здесь, чтобы поделиться со всеми вами своей страстью к разработке, компьютерной инженерии, управлению проектами, личному развитию, хобби и всему, что между ними.

Не стесняйтесь обращаться ко мне в любое время — я буду рада обменяться новыми идеями и вдохновить друг друга!