Destruktorer brukes sjelden i C#, så mange har glemt dem, selv om de er lite nyttige og ubrukelige å studere.
Én. Kjennetegn ved destruktører:
Destruktører kan bare eksistere i klasser, ikke strukturer; Destruktøren kan ikke ha noen modifikatorer, inkludert tilgangskontrollmodifikatorer, statiske modifikatorer, abstrakte modifikatorer, virtuelle modifikatorer osv.; Destruktoren har ingen parametere, noe som betyr at det ikke kan være noen overbelastning.
To. Når man skal kalle destruktøren:
Destruktoren kalles når objektet resirkuleres av søppelsamleren, men søppelsamleren har en egenskap, den er lat, Den resirkulerer ikke variabelen umiddelbart etter at den har forlatt omfanget og levetiden, men bare når den mener det er passende, vanligvis når hukommelsen er trang. For eksempel:
Etter at metoden btn_Click returnerer, skal de avsluttes, men dens destruktør kalles ikke, noe som indikerer at søppelsamleren ikke resirkulerte den; Når du lukker skjemaet, utføres destruktoren, noe som indikerer at søppelsamleren motvillig blir tvunget til å resirkulere det (^-^). Selvfølgelig kan vi ringe GC.Collect() for å tvinge frem resirkulering:
Når du klikker på btn1, avsluttes de1 og ny Demo() og destruktøren kalles opp. de2 har ennå ikke utløpt sin levetid, så selv om GC.Collect-metoden kalles, vil den ikke bli resirkulert; når btn1_Click returneres, har de2 utløpt sin levetid, men på grunn av latskapen til søppelsamleren blir den fortsatt ikke resirkulert; Det er ikke før btn2 kaller GC.Collect-metoden at de2 blir gjenvunnet og dens destruktør kalles.
En måte å forhindre destruktorkall på er å implementere IDisposable-grensesnittet, som definerer en unik metode: Dispose(). Dette forhindrer at destruktøren kalles internt, noe som betyr at hvis du kjeder deg, kan du implementere dette grensesnittet uten å kalle GC.SuppressFinalize(^-^), som er meningsløst fordi det ikke blokkerer destruktøren:
Nå vil ikke destruktøren av de1 bli kalt.
Tre. Essensen av ødeleggeren:
En destruktør er i hovedsak en metode som har formen av:
Vanligvis tror vi at destruktorer bare kan kalles av systemet, ikke av programmererne selv, men dette er ikke helt sant, og destruktorer kan også kalles eksplisitt, tross alt er det bare en metode:
Destruktører er ikke påkrevd med mindre uforvaltede ressurser åpnes i klassen
|