Destruktorer bruges sjældent i C#, så mange har glemt dem, selvom de er af ringe nytte og ubrugelige at studere.
En. Egenskaber ved destruktorer:
Destruktorer kan kun eksistere i klasser, ikke strukturer; Destruktoren kan ikke have nogen modifikatorer, herunder adgangskontrolmodifikatorer, statiske modifikatorer, abstrakte modifikatorer, virtuelle modifikatorer osv.; Destruktoren har ingen parametre, hvilket betyder, at der ikke kan være nogen overbelastning.
To. Hvornår skal destruktøren kaldes:
Destruktoren kaldes, når objektet genbruges af affaldssamleren, men affaldssamleren har en egenskab: den er doven, Den genbruger ikke variablen umiddelbart efter, at den har forladt scope og levetid, men kun når den mener, det er passende, som regel når hukommelsen er stram. For eksempel:
Efter metoden btn_Click returneres, skal de afsluttes, men dens destruktør kaldes ikke, hvilket indikerer, at garbage collector ikke har genanvendt den; Når du lukker formularen, udføres destruktøren, hvilket indikerer, at garbage collector modvilligt tvinges til at genanvende den (^-^). Selvfølgelig kan vi kalde GC.Collect() for at tvinge genbrug:
Når du klikker på btn1, afsluttes de1 og ny Demo(), og destruktøren kaldes. de2 har endnu ikke udløbet sin levetid, så selv hvis GC.Collect-metoden kaldes, vil den ikke blive genanvendt; når btn1_Click returneres, har de2 udløbet sin levetid, men på grund af affaldssamlerens dovenskab bliver den stadig ikke genanvendt; Det er først, når btn2 kalder GC.Collect-metoden, at de2 genvindes, og dens destruktør kaldes.
En måde at forhindre destruktorkald på er at implementere IDisposable-interfacet, som definerer en unik metode: Dispose(). Dette forhindrer, at destruktøren kaldes internt, hvilket betyder, at hvis du keder dig, kan du implementere dette interface uden at kalde GC.SuppressFinalize(^-^), hvilket er meningsløst, fordi det ikke blokerer destruktøren:
Nu vil destruktoren af de1 ikke blive kaldt.
Tre. Essensen af destruktøren:
En destruktør er i det væsentlige en metode, der har formen af:
Normalt tror vi, at destruktorer kun kan kaldes af systemet, ikke af programmørerne selv, men det er ikke helt sandt, og destruktorer kan også kaldes eksplicit, for det er trods alt bare en metode:
Destruktorer er ikke nødvendige, medmindre uadministrerede ressourcer åbnes i klassen
|