Hävitajaid kasutatakse C#-s harva, nii et paljud on neist unustanud, kuigi neist pole eriti kasu ja neid pole võimalik uurida.
Üks. Hävitajate omadused:
Destruktorid võivad eksisteerida ainult klassides, mitte struktuurides; Destructor ei tohi omada ühtegi modifikaatorit, sealhulgas juurdepääsukontrolli modifikaatoreid, staatilisi modifikaatoreid, abstraktseid modifikaatoreid, virtuaalseid modifikaatoreid jne; Destruktoril puuduvad parameetrid, mis tähendab, et ülekoormust ei saa olla.
Kaks. Millal kutsuda hävitaja:
Hävitaja kutsutakse siis, kui prügikoguja taaskasutab objekti, kuid prügikogujal on omadus – ta on laisk, See ei taaskasuta muutujat kohe pärast selle lahkumist ulatusest ja elueast, vaid ainult siis, kui peab seda sobivaks, tavaliselt siis, kui mälu on napp. Näiteks:
Pärast meetodi btn_Click tagasitulekut tuleks de lõpetada, kuid selle hävitajat ei kutsuta, mis viitab sellele, et prügikoguja ei taaskasutanud seda; Kui vormi sulged, käivitatakse destructor, mis näitab, et programmi lõpus on prügikoristaja vastumeelselt sunnitud selle taaskasutama (^-^). Muidugi võime kutsuda GC.Collect(), et sundida taaskasutust:
Kui klikid btn1, lõpetatakse de1 ja uus Demo() ning destructor kutsutakse välja. de2 ei ole veel oma eluiga läbi saanud, seega isegi kui kasutatakse GC.Collect meetodit, seda ei taaskasutata; kui btn1_Click naaseb, on de2 oma eluiga lõppenud, kuid prügikoguja laiskuse tõttu seda ikkagi ei taaskasutata; Alles siis, kui btn2 kutsub GC.Collect meetodi, taastatakse de2 ja kutsutakse selle hävitaja.
Üks viis destructori kutsete vältimiseks on IDisposable liidese rakendamine, mis määratleb unikaalse meetodi: Dispose(). See takistab destructori sisemist kutsumist, mis tähendab, et kui sul on igav, saad selle liidese rakendada ilma GC.SuppressFinalize(^-^) kutsumata, mis on mõttetu, sest see ei blokeeri destructorit:
Nüüd ei kutsuta de1 hävitajat.
Kolm. Hävitaja olemus:
Destruktor on põhimõtteliselt meetod, mis avaldub järgmiselt:
Tavaliselt arvame, et destruktoreid saab kutsuda ainult süsteem ise, mitte programmeerijad ise, kuid see pole päris tõsi ning destruktoreid saab kutsuda ka otseselt, sest see on ju lihtsalt meetod:
Hävitajad ei ole vajalikud, välja arvatud juhul, kui klassis on avatud haldamata ressursse
|