Kuo skiriasi konstruktorius nuo destruktoriaus C #?


Atsakymas 1:

C # neturi naikintojų, jis turi užbaigtuvus, kurie skiriasi.

Iš esmės konstruktorius yra tai, kas vadinama „naujuoju“ raktiniu žodžiu, o kalbomis, kuriose jie yra, destruktoriai vadinami raktiniu žodžiu „ištrinti“ (arba kai objektas netenka galios).

Kita vertus, galutinį variantą šiukšlių surinkėjas vadina tam tikru metu po to, kai daiktas išeina arba yra objektas (techniškai, kai nėra daugiau rodyklių, kurios taip pat nėra „už objekto ribų“).

Du svarbūs dalykai, į kuriuos reikia atkreipti dėmesį baigiant kūrėjus:

  • Jūs negalite tiksliai žinoti, kada jis bus vadinamas. Turite būti atsargūs dėl to, ką darote užbaigimo priemonėje - kiti objektai, klasifikuojami toje pačioje klasėje, jau galėjo būti surinkti. „Finalizer“ turėtumėte paliesti tik nevaldomas nuorodas.

Jei norite / jums reikia kažko arčiau C # naikintojo, turite IDisposable interfeisą, kuris pateikia metodą; „Išmeskite“.

C # turi specialų raktinį žodį „naudojant“, kuris skelbia objektą apimtimi ir garantuoja, kad bus išmestas disponavimo metodas.

Šis metodas taip pat turėtų atsisakyti bet kokių identifikuojamų objektų, kurie priklauso įdiegimo klasei.

Jei klasėje yra nevaldomų objektų, turėtumėte sukurti perkrovos metodą, kuris naudoja loginį parametrą. Šis metodas turėtų disponuoti visomis neapdorotomis nuorodomis, o jei bool parametras yra teisingas, jis taip pat turėtų pašalinti bet kokius identifikuojamus objektus. Tada turėtumėte sukurti užbaigimo priemonę, kuri iškviestų dispoziciją (klaidinga), kad būtų užtikrinta, jog nevaldomi ištekliai bus išlaisvinti tuo atveju, jei šalinimo metodas niekada nebuvo vadinamas. Įprastinis šalinimas turėtų skambinti kaip disponavimas (tiesa), taip pat skambinti GC.SurpressFinalize (), nes baigti nereikės (tai užtikrina, kad objektas greičiau surinks šiukšles, ir padės išvengti klaidų galutiniame variante).


Atsakymas 2:

Konstruktorius ir destruktorius yra speciali klasės narių funkcija bet kuriomis programavimo kalbomis, tokiomis kaip c # ar Java. Funkcija disertacijos nariai turi tą patį vardą, kaip ir klasės pavadinimas, ir yra naudojama, kai mes sukuriame klasės objektą.

Iš esmės konstruktorius yra naudojamas klasės duomenims inicijuoti, o sunaikintojas yra naudojamas objektams sunaikinti arba objekto užimtoms atmintims atlaisvinti.

Vienas realaus laiko konstruktoriaus naudojimas yra inicijuoti duomenų narius su numatytosiomis reikšmėmis, todėl mes turime numatytąjį konstruktorių.

Pavyzdžiui, kai kuriame bet kokio domeno, pvz., „Gmail“, „Yahoo“ ar „Microsoft“, el. Paštą, gautuosiuose gauname kelis numatytuosius el. Laiškus, tai reiškia, kad šie el. Pašto adresai yra numatytosios vertės.

Norėdami geriau tai suprasti, laikykite „Gmail“ kaip klasę.

klasės „Gmail“
{
 eilutės pranešimas;
 viešas „Gmail“ (vartotojo vardas)
 {
   žinutė = „Sveiki atvykę į„ Gmail “+ Vartotojo vardas
 }
}
Pagrindinėje funkcijoje
„Gmail g1“ = nauja „Gmail“ („Shinchan.gupta“);
„Gmail g2“ = nauja „Gmail“ („aching.gupta“);

Dabar, kai tik sukursime naują el. Pašto ID, tai reiškia, kad mes kuriame naują „Gmail“ objektą. Tai inicijuos pranešimų duomenų narius su numatytosiomis viso objekto reikšmėmis, todėl kiekvienas „gmail“ vartotojas gauna tą patį pranešimą gautuosiuose ir tai yra numatytasis paštas, kurį galite pasakyti.

Dabar mes sukūrėme du objektus, kuriuose yra atminties paskirstymas, kuris turėtų būti paleistas, kai programa bus paleista, ir tam mes turime destruktorių, kuris taip pat vadinamas automatiškai, ir sunaikinkite objektus, kad atlaisvintumėte atmintį.

Paprasčiau tariant, kai naudojate konstruktorių, jis paskirsto atmintį, o kai naudojate destruktorių, jis atlaisvina paskirtą atmintį.