Destructoreita käytetään harvoin C#:ssa, joten monet ovat unohtaneet ne, vaikka ne ovat vähäpätöisiä ja hyödyttömiä tutkia.
Yksi. Tuhoajien ominaisuudet:
Tuhoajat voivat olla olemassa vain luokissa, eivät rakenteissa; Tuhoajalla ei voi olla mitään modifikaattoreita, mukaan lukien kulunvalvontamuokkaajat, staattiset modifikaattorit, abstraktit modifikaattorit, virtuaalimodifikaattorit jne.; Tuhoajalla ei ole parametreja, mikä tarkoittaa, ettei ylikuormitusta voi syntyä.
Kaksi. Milloin kutsua tuhoaja:
Tuhoaja kutsutaan, kun roskankerääjä kierrättää esineen, mutta jätekerääjällä on ominaisuus: se on laiska, Se ei kierrätä muuttujaa heti sen jälkeen, kun se on poistunut laajuudesta ja elinkaaresta, vaan vain silloin, kun se katsoo sen sopivaksi, yleensä kun muisti on tiukka. Esimerkiksi:
Kun menetelmä btn_Click palaa, de tulisi lopettaa, mutta sen tuhoajaa ei kutsuta, mikä tarkoittaa, ettei jätekeräijä kierrättänyt sitä; Kun lomakkeen suljetaan, tuhoaja suoritetaan, mikä tarkoittaa, että ohjelman lopussa jätekerääjä joutuu vastahakoisesti kierrättämään sen (^-^). Tietenkin voimme soittaa GC.Collect():lle pakottaaksemme kierrätyksen:
Kun klikkaat btn1, de1 ja uusi Demo() päättyvät ja tuhoaja kutsutaan. de2:n elinkaari ei ole vielä päättynyt, joten vaikka GC.Collect -menetelmää kutsuttaisiin, sitä ei kierrätetä; kun btn1_Click palaa, de2:n elinikä on päättynyt, mutta jätehuoltomiehen laiskuuden vuoksi sitä ei silti kierrätetä; Vasta kun btn2 kutsuu GC.Collect-metodin, de2 otetaan takaisin ja sen tuhoaja kutsutaan.
Yksi tapa estää tuhoajakutsut on toteuttaa IDisposable interface, joka määrittelee ainutlaatuisen metodin: Dispose(). Tämä estää destructorin kutsumisen sisäisesti, mikä tarkoittaa, että jos olet tylsistynyt, voit toteuttaa tämän rajapinnan ilman GC.SuppressFinalize(^-^):n kutsumista, mikä on merkityksetöntä, koska se ei estä tuhoajaa:
Nyt de1:n tuhoajaa ei kutsuta.
Kolme. Tuhoajan olemus:
Tuhoaja on pohjimmiltaan menetelmä, joka ilmenee seuraavasti:
Yleensä ajattelemme, että destruktoreita voi kutsua vain järjestelmä, ei ohjelmoijat itse, mutta tämä ei ole täysin totta, ja destruktoreita voidaan kutsua myös eksplisiittisesti, loppujen lopuksi se on vain metodi:
Tuhoajia ei tarvita, ellei luokassa ole avattu hallitsemattomia resursseja
|