Προγραμματισμός

Τα δύο λεπτά μου σε αδύναμες αναφορές στο .Net

Το GC είναι ικανό να ανακτήσει τη μνήμη που καταλαμβάνουν τα διαχειριζόμενα αντικείμενα. Ωστόσο, θα πρέπει να λάβετε επιπλέον μέτρα για να διευκολύνετε τη συλλογή απορριμμάτων για βελτιωμένη απόδοση των εφαρμογών σας.

Μια αδύναμη αναφορά είναι αυτή που αναφέρεται σε ένα αντικείμενο στη μνήμη, ενώ ταυτόχρονα επιτρέπει στον συλλέκτη απορριμμάτων να συλλέγει το αντικείμενο ή να ανακτά τη μνήμη που καταλαμβάνει το αντικείμενο όταν εκτελείται το GC. Ένα αντικείμενο που είναι προσβάσιμο δεν είναι σκουπίδια που συλλέγονται από το χρόνο εκτέλεσης.

Μπορείτε να χρησιμοποιήσετε αδύναμες αναφορές για αντικείμενα που καταναλώνουν πολλή μνήμη. Χρησιμοποιώντας αδύναμες αναφορές για τέτοια αντικείμενα, επιτρέπετε σε αυτά τα αντικείμενα να συλλέγονται σκουπίδια, ενώ ταυτόχρονα επιτρέπεται η αναδημιουργία αυτών των αντικειμένων αργότερα, εάν χρειάζεται. Έτσι, εάν έχετε ένα μεγάλο αντικείμενο στην εφαρμογή σας που θα χρησιμοποιείτε λιγότερο συχνά, μπορείτε να χρησιμοποιήσετε αδύναμη αναφορά σε τέτοια αντικείμενα, υπό την προϋπόθεση ότι η αναδημιουργία τέτοιων αντικειμένων δεν είναι τόσο ακριβή.

Σημειώστε ότι όταν δημιουργείτε μια αδύναμη αναφορά σε ένα αντικείμενο, ένα IntPtr σε ένα GCHandle αποθηκεύεται εσωτερικά από την αδύναμη αναφορά που έχετε δημιουργήσει. Ο χρόνος εκτέλεσης χρησιμοποιεί αυτό το GCHandle για τη διαχείριση ενός πίνακα που περιέχει αδύναμες αναφορές σε αντικείμενα. Εάν ένα αντικείμενο έχει ήδη συλλεχθεί σκουπίδια, η τιμή του IntPtr θα είναι IntPtr.Zero. Όταν ολοκληρωθεί η αδύναμη αναφορά στο αντικείμενο, καταργείται η αντίστοιχη καταχώριση της αδύναμης αναφοράς στο αντικείμενο στον ασθενή πίνακα αναφοράς. Εάν η αδύναμη αναφορά στο αντικείμενο είναι ακόμα ζωντανή και επικαλέστε την ιδιότητα Target στην ασθενή αναφορά, επιστρέφεται το πραγματικό αντικείμενο που επισημαίνεται από το GCHandle της αδύναμης αναφοράς.

Η δημιουργία μιας αδύναμης αναφοράς σε ένα αντικείμενο δεν αυξάνει το χρόνο ζωής του αντικειμένου. Επιτρέπει στον συλλέκτη απορριμμάτων να ανακτήσει τη μνήμη που καταλαμβάνει το αντικείμενο όταν δεν υπάρχουν ισχυρές αναφορές σε αυτό το αντικείμενο. Η διαφορά μεταξύ μιας αδύναμης και μιας ισχυρής αναφοράς σε ένα αντικείμενο είναι ότι ενώ ο πρώτος εξακολουθεί να επιτρέπει στον συλλέκτη απορριμμάτων να ανακτήσει τη μνήμη που καταλαμβάνεται από αυτό το αντικείμενο, μια ισχυρή αναφορά σε ένα αντικείμενο δεν επιτρέπει στον συλλέκτη απορριμμάτων να ανακτήσει τη μνήμη που καταλαμβάνεται από αυτό το αντικείμενο εάν το αντικείμενο είναι προσβάσιμο.

Προγραμματισμός αδύναμης αναφοράς στο C #

Για να δημιουργήσετε μια αδύναμη αναφορά θα πρέπει να επωφεληθείτε από την κλάση System.WeakReference. Μόλις δημιουργήσετε μια αδύναμη αναφορά σε ένα αντικείμενο, μπορείτε να χρησιμοποιήσετε την ιδιότητα Target της αδύναμης αναφοράς που έχετε δημιουργήσει για να ελέγξετε αν το αρχικό αντικείμενο είναι ακόμα ζωντανό. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να δημιουργήσετε μια αδύναμη αναφορά σε ένα αντικείμενο.

Ορθογώνιο ορθογώνιο = νέο ορθογώνιο (15, 10);

var lemahReference = νέο WeakReference (ορθογώνιο);

Μπορείτε να χρησιμοποιήσετε την ιδιότητα IsAlive για να ελέγξετε αν η αδύναμη αναφορά στο αντικείμενο είναι ακόμα ζωντανή. Ακολουθεί μια λίστα κωδικών που το απεικονίζει αυτό.

static void Main (συμβολοσειρά [] args)

        {

Ορθογώνιο ορθογώνιο = νέο ορθογώνιο (15, 10);

var lemahReference = νέο WeakReference (ορθογώνιο);

ορθογώνιο = null;

bool isAlive = lemahReference.IsAlive;

εάν (isAlive)

Console.WriteLine ("Το αντικείμενο είναι ακόμα ζωντανό");

Κονσόλα. Διαβάστε ();

        }

Εάν η ισχυρή αναφορά στο αντικείμενο δεν είναι πλέον διαθέσιμη, μπορείτε να αξιοποιήσετε την ιδιότητα Target της αδύναμης αναφοράς για να χρησιμοποιήσετε το αντικείμενο όπως φαίνεται στο απόσπασμα κώδικα που δίνεται παρακάτω.

bool isAlive = lemahReference.IsAlive;

εάν (isAlive)

{

Ορθογώνιο ορθογώνιο = ασθενέςReference.Target ως ορθογώνιο;

// Τώρα μπορείτε να χρησιμοποιήσετε το ορθογώνιο αντικείμενο ως συνήθως

}

Σύντομες και μακροχρόνιες αδύναμες αναφορές

Οι αδύναμες αναφορές μπορεί να είναι βραχύβιες ή μακροχρόνιες. Η κύρια διαφορά μεταξύ βραχείας και αδύναμης αναφοράς είναι ότι ενώ στην πρώτη περίπτωση η ιδιότητα Target της αδύναμης αναφοράς καθίσταται άκυρη εάν το GC ανακτήσει το αντικείμενο, στην τελευταία περίπτωση η μακρά αδύναμη αναφορά είναι ζωντανή ακόμα και μετά την εκτέλεση του GC, δηλαδή επιβιώνει έναν κύκλο GC. Λάβετε υπόψη ότι πρέπει να χρησιμοποιείτε προσεκτικά αδύναμες αναφορές, καθώς η κατάσταση του αντικειμένου δεν μπορεί να προβλεφθεί μετά την ολοκλήρωση.

Στην ουσία, θα πρέπει να χρησιμοποιείτε σύντομες αδύναμες αναφορές όταν θέλετε να χρησιμοποιήσετε ένα αντικείμενο που βρίσκεται σε χρησιμοποιήσιμη κατάσταση. Αντίθετα, μια μακρά αδύναμη αναφορά είναι μια καλή επιλογή όταν θα θέλατε να χρησιμοποιήσετε το αντικείμενο ανεξάρτητα από την κατάστασή του. Για να δημιουργήσετε μια μακρά αδύναμη αναφορά, πρέπει να μεταβιβάσετε το "true" ως τη δεύτερη παράμετρο στον υπερφορτωμένο κατασκευαστή της κλάσης WeakReference ενώ δημιουργείτε την αδύναμη αναφορά. Το ακόλουθο απόσπασμα κώδικα το δείχνει αυτό.

Ορθογώνιο ορθογώνιο = νέο ορθογώνιο (15, 10);

var lemahReference = νέο WeakReference (ορθογώνιο, true);

$config[zx-auto] not found$config[zx-overlay] not found