Оглавление:
Определение - Что означает Deep Copy?
Глубокая копия в C # относится к технике, с помощью которой создается копия объекта, которая содержит копии как членов экземпляра, так и объектов, на которые указывают ссылочные члены.
Глубокое копирование предназначено для копирования всех элементов объекта, которые включают в себя элементы с прямой ссылкой (типа значения) и элементы с косвенной ссылкой типа ссылки, который содержит ссылку (указатель) на область памяти, которая содержит данные, а не содержит сами данные. Глубокая копия используется в тех случаях, когда создается новая копия (клон) без какой-либо ссылки на исходные данные.
Техопедия объясняет Deep Copy
Глубокая копия отличается от мелкой копии тем, как копируются элементы ссылочного типа объекта. При копировании членов поля типа значения в обоих случаях выполняется побитовая копия поля. При копировании полей ссылочного типа мелкое копирование включает в себя копирование только ссылки, тогда как в глубоком копировании выполняется новая копия упомянутого объекта.
Глубокое копирование можно проиллюстрировать на примере, рассматривая объект Employee, имеющий AddressInfo в качестве члена ссылочного типа наряду с другими членами типа значения. Глубокая копия Employee создает новый объект Employee2, члены которого имеют тип значения, равный Employee, но ссылаются на новый объект AddressInfo2, который является копией AddressInfo.
Глубокое копирование может быть реализовано любым из следующих способов:
- Конструктор копирования класса может быть реализован с необходимой логикой для копирования членов как значений, так и ссылок (после правильного выделения памяти). Этот метод утомителен и подвержен ошибкам.
- Метод System.Object.MemberwiseClone можно использовать для копирования нестатических членов типа значения. Копии объектов ссылочного типа могут быть созданы и присвоены с тем же набором значений, что и оригинал.
- Объект, который должен быть глубоко скопирован, может быть сериализован и десериализован в новый объект путем его восстановления. Этот метод автоматизирован и не требует изменений кода для изменений в элементах объекта, но медленнее, чем другие методы, и требует, чтобы клонированный объект был сериализуемым
- Отражение с рекурсией можно использовать для получения мелкой копии, после чего можно добавить дополнительный код, необходимый для глубокой копии. Этот метод автоматизирован и не требует изменений кода для добавления или удаления полей в объекте. Это медленнее и не допускается в среде частичного доверия
- Можно использовать код на промежуточном языке, который быстрее, но приводит к меньшей читаемости кода и сложному обслуживанию
Для реализации глубокого копирования:
- Объект должен быть четко определен и не может быть произвольным
- Свойства объекта не будут учитываться
- Клонирование должно быть автоматизировано с помощью интеллекта для особых случаев (например, объектов, содержащих неуправляемые ссылки)