Sisällysluettelo:
Määritelmä - mitä syväkopio tarkoittaa?
Syvä kopio C # -merkinnässä viittaa tekniikkaan, jolla objektin kopio luodaan siten, että se sisältää kopioita molemmista ilmentymän jäsenistä ja objekteista, joihin viitejäsenet osoittavat.
Syvän kopion tarkoituksena on kopioida kaikki objektin elementit, jotka sisältävät suoraan viitatut (arvotyyppiset) elementit ja epäsuorasti viitatut vertailutyypin elementit, joilla on viite (osoitin) muistipaikkaan, joka sisältää tietoja sen sijaan, että itse tiedot. Syväkopiota käytetään tilanteissa, joissa luodaan uusi kopio (klooni) ilman viittauksia alkuperäisiin tietoihin.
Techopedia selittää syvän kopion
Syväkopio eroaa matalasta kopiosta sillä tavalla, jolla kohteen viitetyypin jäsenet kopioidaan. Kun kopioidaan arvotyyppisiä kenttäjäseniä molemmissa tapauksissa, kenttä suoritetaan bitti kerrallaan. Kun kopioidaan vertailutyyppikenttiä, matalakopiointi tarkoittaa vain referenssikopiointia, kun taas syväkopiossa suoritetaan viitatun kohteen uusi kopio.
Syväkopio voidaan havainnollistaa esimerkillä tarkastelemalla työntekijäobjektia, jonka AddressInfo on referenssityypin jäsen, yhdessä muiden arvotyypin jäsenten kanssa. Työntekijän syvä kopio luo uuden objektin, Työntekijä2, jonka arvotyyppi on yhtä suuri kuin Työntekijä, mutta viittaa uuteen objektiin, AddressInfo2, joka on kopio AddressInfosta.
Syväkopio voidaan toteuttaa jollain seuraavista tavoista:
- Luokan kopiorakentaja voidaan toteuttaa tarvittavalla logiikalla sekä arvo- että referenssityyppisten (asianmukaisen muistin allokoinnin jälkeen) jäsenten kopioimiseksi. Tämä menetelmä on työläs ja virhealtista.
- System.Object.MemberwiseClone-menetelmää voidaan käyttää kopioimaan arvotyypin epästaattiset jäsenet. Referenssityyppisten objektien kopioita voidaan luoda ja osoittaa samoilla arvoilla kuin alkuperäinen
- Kohde, joka on syväkopioitava, voidaan sarjastaa ja poistaa sarjasta se uudeksi esineeksi palauttamalla se. Tämä menetelmä on automatisoitu, eikä se vaadi koodinmuutoksia objektien jäsenten modifikaatioihin, mutta on hitaampi kuin muut menetelmät ja vaatii kloonatun objektin olevan sarjoitettavia
- Rekursion heijastuksella voidaan saada matala kopio, jolloin syväkopiointiin tarvittava lisäkoodi voidaan lisätä. Tämä menetelmä on automatisoitu, eikä se vaadi koodimuutoksia objektien kenttien lisäämiseen tai poistamiseen. Se on hitaampaa eikä sitä sallita osittaisessa luottamusympäristössä
- Keskikielikoodia voidaan käyttää, mikä on nopeampaa, mutta johtaa koodin huonompaan luettavuuteen ja vaikeaseen ylläpitoon
Syvän kopion toteuttaminen:
- Kohteen on oltava selvästi määritelty eikä se voi olla mielivaltainen
- Kohteen ominaisuuksia ei oteta huomioon
- Kloonaus on automatisoitava tiedustelulla erityistapauksia varten (kuten objektit, jotka sisältävät hallitsemattomia viitteitä)
