Obsah:
Definice - Co znamená Deep Copy?
Hluboká kopie v C # označuje techniku, pomocí níž se vytvoří kopie objektu tak, že obsahuje kopie členů instance i objektů, na které odkazují referenční členové.
Hluboká kopie je určena ke kopírování všech prvků objektu, které zahrnují přímo odkazované prvky (typu hodnoty) a nepřímo odkazované prvky typu odkazu, který drží odkaz (ukazatel), do paměťového umístění, které obsahuje data, spíše než obsahující samotná data. Hluboká kopie se používá ve scénářích, kde je vytvořena nová kopie (klon) bez jakéhokoli odkazu na původní data.
Techopedia vysvětluje hlubokou kopii
Hluboká kopie se liší od mělké kopie způsobem kopírování členů referenčního typu objektu. Při kopírování členů pole typu hodnoty v obou případech se provádí bit-by-bit kopie pole. Při kopírování polí referenčního typu zahrnuje mělká kopie pouze kopírování odkazu, zatímco u hluboké kopie se provádí nová kopie odkazovaného objektu.
Hluboká kopie může být ilustrována na příkladu tím, že zvažuje objekt Zaměstnanec mající AddressInfo jako člen typu reference spolu s ostatními členy typu hodnoty. Hluboká kopie zaměstnance vytvoří nový objekt, zaměstnanec 2, se členy typu hodnoty rovným zaměstnanci, ale odkazuje na nový objekt, AddressInfo2, což je kopie AddressInfo.
Hlubokou kopii lze implementovat některou z následujících metod:
- Konstruktor kopírování třídy může být implementován s nezbytnou logikou pro kopírování členů jak hodnotových, tak referenčních (po správném přidělení paměti) typů. Tato metoda je únavná a náchylná k chybám.
- Metodu System.Object.MemberwiseClone lze použít ke kopírování nestatických členů typu hodnoty. Kopie objektů referenčního typu lze vytvořit a přiřadit se stejnou sadou hodnot jako originál
- Objekt, který musí být zkopírován do hloubky, může být serializován a de-serializován do nového objektu jeho obnovením. Tato metoda je automatizovaná a nevyžaduje změny kódu pro úpravy členů objektu, ale je pomalejší než jiné metody a vyžaduje, aby byl klonovaný objekt serializovatelný.
- Reflexe s rekurzí lze použít k získání mělké kopie, kdy lze přidat další kód nezbytný pro hlubokou kopii. Tato metoda je automatizovaná a nevyžaduje žádné změny kódu pro přidání nebo odebrání polí v objektu. V prostředí částečné důvěry je pomalejší a není povoleno
- Lze použít mezikódový kód jazyka, který je rychlejší, ale vede k menší čitelnosti kódu a obtížné údržbě
Implementace hluboké kopie:
- Objekt musí být dobře definován a nemůže být libovolný
- Vlastnosti objektu nebudou brány v úvahu
- Klonování musí být automatizováno pomocí inteligence pro zvláštní případy (jako objekty obsahující nespravované odkazy)