Indholdsfortegnelse:
Definition - Hvad betyder Deep Copy?
Dybkopi, i C #, henviser til en teknik, hvormed der oprettes en kopi af et objekt, således at det indeholder kopier af både forekomstmedlemmer og de objekter, der henvises til af referencemedlemmer.
Dybkopi er beregnet til at kopiere alle elementer i et objekt, der inkluderer elementer, der direkte henvises til (af værdienstype) og de indirekte refererede elementer af en referencetype, der indeholder en henvisning (pointer) til et hukommelsessted, der indeholder data i stedet for at indeholde data selv. Dybkopi bruges i scenarier, hvor en ny kopi (klon) oprettes uden nogen henvisning til originaldata.
Techopedia forklarer Deep Copy
Dyb kopi adskiller sig fra lav kopi på den måde, hvorpå objektets referencemedlemmer kopieres. Mens du kopierer feltmedlemmer af værditype i begge tilfælde, udføres en bit-for-bit-kopi af felt. Ved kopiering af felter af referencetype involverer lav kopi kun at kopiere referencen, mens der i dyb kopi udføres en ny kopi af det refererede objekt.
Dybkopi kan illustreres med et eksempel ved at betragte et medarbejderobjekt, der har AddressInfo som medlem af referencetype sammen med andre medlemmer af værditype. En dyb kopi af Medarbejder opretter et nyt objekt, Medarbejder2, med medlemmer af værditype, der er lig med Medarbejder, men henviser til et nyt objekt, AdresseInfo2, som er en kopi af AdresseInfo.
Dybkopi kan implementeres ved hjælp af en af følgende metoder:
- Kopieringskonstruktør af klassen kan implementeres med den nødvendige logik til at kopiere medlemmer af både værdi og reference (efter korrekt hukommelsestildeling). Denne metode er kedelig og har en tendens til fejl.
- System.Object.MemberwiseClone-metoden kan bruges til at kopiere de ikke-statiske medlemmer af værditype. Kopier af objekter af referencetype kan oprettes og tildeles med det samme sæt værdier som originalen
- Et objekt, der skal kopieres dybt, kan serialiseres og de-serialiseres til et nyt objekt ved at gendanne det. Denne metode er automatiseret og kræver ikke kodeændringer til ændringer i objektmedlemmer, men er langsommere end andre metoder og kræver, at det klonede objekt kan serialiseres
- Reflektion med rekursion kan bruges til at få en lav kopi, på hvilket tidspunkt den ekstra kode, der er nødvendig for dyb kopi, kan tilføjes. Denne metode er automatiseret og kræver ikke kodeændringer til nogen tilføjelse eller fjernelse af felter i objektet. Det er langsommere og ikke tilladt i delvis tillidsmiljø
- Mellem sprogkode kan bruges, hvilket er hurtigere, men resulterer i mindre kodelæsbarhed og vanskelig vedligeholdelse
Sådan implementeres dybkopi:
- Objektet skal være veldefineret og ikke være vilkårligt
- Objektets egenskaber vil ikke blive taget i betragtning
- Kloning skal automatiseres med intelligens til specielle tilfælde (som genstande, der indeholder uhåndterede referencer)
