Destructors worden zelden gebruikt in C#, dus veel mensen zijn ze vergeten, hoewel ze weinig nut hebben en nutteloos zijn om te bestuderen.
Een. Kenmerken van destructors:
Destructors kunnen alleen bestaan in klassen, niet in structuren; De destructor mag geen modificatoren hebben, waaronder toegangscontrolemodificatoren, statische modificatoren, abstracte modificatoren, virtuele modificatoren, enzovoort; De destructor heeft geen parameters, wat betekent dat er geen overbelasting kan zijn.
Twee. Wanneer de destructor moet worden aangeroepen:
De destructor wordt aangeroepen wanneer het object wordt gerecycled door de garbage collector, maar de garbage collector heeft een eigenschap: hij is lui, Het recyclet de variabele niet direct nadat deze de scope en levensduur heeft verlaten, maar alleen wanneer het denkt dat het passend is, meestal wanneer het geheugen krap is. Bijvoorbeeld:
Nadat de methode btn_Click terugkeert, moet de worden beëindigd, maar de destructor wordt niet aangeroepen, wat aangeeft dat de garbage collector het niet heeft gerecycled; Wanneer je het formulier sluit, wordt de destructor uitgevoerd, wat aangeeft dat de afvalverzamelaar aan het einde van het programma met tegenzin gedwongen wordt het te recyclen (^-^). Natuurlijk kunnen we GC.Collect() bellen om recycling af te dwingen:
Wanneer je op btn1 klikt, worden de1 en nieuwe Demo() beëindigd en wordt de destructor aangeroepen. de2 heeft zijn levensduur nog niet verlopen, dus zelfs als de GC.Collect-methode wordt aangeroepen, wordt deze niet gerecycled; wanneer de btn1_Click terugkeert, is de2 zijn levensduur verlopen, maar door de luiheid van de afvalverzamelaar wordt hij nog steeds niet gerecycled; Pas wanneer btn2 de GC.Collect-methode aanroept, wordt de2 teruggewonnen en wordt de destructor ervan aangeroepen.
Een manier om destructoroproepen te voorkomen is het implementeren van de IDisposable-interface, die een unieke methode definieert: Dispose(). Dit voorkomt dat de destructor intern wordt aangeroepen, wat betekent dat als je je verveelt, je deze interface kunt implementeren zonder de GC.SuppressFinalize(^-^ aan te roepen, wat zinloos is omdat het de destructor niet blokkeert:
Nu wordt de destructor van de1 niet meer aangeroepen.
Drie. De essentie van de vernietiger:
Een destructor is in wezen een methode die de vorm aanneemt als:
Meestal denken we dat destructors alleen door het systeem kunnen worden aangeroepen, niet door de programmeurs zelf, maar dit is niet helemaal waar, en destructors kunnen ook expliciet worden aangeroepen, want het is gewoon een methode:
Destructors zijn niet nodig tenzij onbeheerde resources in de klasse worden geopend
|