Οι καταστροφείς χρησιμοποιούνται σπάνια στη C#, έτσι πολλοί άνθρωποι τους έχουν ξεχάσει, αν και είναι ελάχιστα χρήσιμοι και είναι άχρηστοι για μελέτη.
Ένα. Χαρακτηριστικά των καταστροφέων:
Οι καταστροφείς μπορούν να υπάρχουν μόνο σε, όχι σε δομές. Ο καταστροφέας δεν μπορεί να έχει τροποποιητές, συμπεριλαμβανομένων τροποποιητών ελέγχου πρόσβασης, στατικών τροποποιητών, αφηρημένων τροποποιητών, εικονικών τροποποιητών κ.λπ. Ο καταστροφέας δεν έχει παραμέτρους, πράγμα που σημαίνει ότι δεν μπορεί να υπάρξει υπερφόρτωση.
Δύο. Πότε να καλέσετε τον καταστροφέα:
Ο καταστροφέας καλείται όταν το αντικείμενο ανακυκλώνεται από τον συλλέκτη σκουπιδιών, αλλά ο συλλέκτης σκουπιδιών έχει ένα χαρακτηριστικό, είναι τεμπέλης, Δεν ανακυκλώνει τη μεταβλητή αμέσως μετά την έξοδο από το πεδίο εφαρμογής και τη διάρκεια ζωής της, αλλά μόνο όταν πιστεύει ότι είναι κατάλληλο, συνήθως όταν η μνήμη είναι περιορισμένη. Για παράδειγμα:
Μετά την επιστροφή της μεθόδου btn_Click, de θα πρέπει να τερματιστεί, αλλά ο καταστροφέας του δεν καλείται, υποδεικνύοντας ότι ο συλλέκτης σκουπιδιών δεν το ανακύκλωσε. Όταν κλείνετε τη φόρμα, ο καταστροφέας εκτελείται, υποδεικνύοντας ότι στο τέλος του προγράμματος, ο συλλέκτης απορριμμάτων αναγκάζεται απρόθυμα να τον ανακυκλώσει (^-^). Φυσικά, μπορούμε να καλέσουμε την GC.Collect() για να αναγκάσουμε την ανακύκλωση:
Όταν κάνετε κλικ στο btn1, το de1 και το new Demo() τερματίζονται και καλείται ο καταστροφέας. Το de2 δεν έχει λήξει ακόμη την περίοδο ζωής του, οπότε ακόμα κι αν κληθεί η μέθοδος GC.Collect, δεν θα ανακυκλωθεί. όταν το btn1_Click επιστρέψει, το de2 έχει λήξει η περίοδος ζωής του, αλλά λόγω της τεμπελιάς του συλλέκτη σκουπιδιών, εξακολουθεί να μην ανακυκλώνεται. Μόνο όταν το btn2 καλέσει τη μέθοδο GC.Collect, το de2 ανακτάται και καλείται ο καταστροφέας του.
Ένας τρόπος για να αποτρέψετε τις κλήσεις του καταστροφέα είναι να εφαρμόσετε τη διεπαφή IDisposable, η οποία ορίζει μια μοναδική μέθοδο: Dispose(). Αυτό αποτρέπει την εσωτερική κλήση του καταστροφέα, πράγμα που σημαίνει ότι αν βαρεθείτε, μπορείτε να εφαρμόσετε αυτήν τη διεπαφή χωρίς να καλέσετε το GC.SuppressFinalize(^-^), το οποίο δεν έχει νόημα επειδή δεν μπλοκάρει τον καταστροφέα:
Τώρα ο καταστροφέας του de1 δεν θα κληθεί.
Τρεις. Η ουσία του καταστροφέα:
Ο καταστροφέας είναι ουσιαστικά μια μέθοδος που λαμβάνει τη μορφή:
Συνήθως πιστεύουμε ότι οι καταστροφείς μπορούν να κληθούν μόνο από το σύστημα, όχι από τους ίδιους τους προγραμματιστές, αλλά αυτό δεν είναι απολύτως αληθές, και οι καταστροφείς μπορούν επίσης να κληθούν ρητά, τελικά, είναι απλώς μια μέθοδος:
Οι καταστροφείς δεν απαιτούνται εκτός εάν ανοίξουν μη διαχειριζόμενοι πόροι στην κλάση
|