Διαδρομές
/
C#
C#
/
Ύλη
/
Καθαρισμός πόρων
Κα

Καθαρισμός πόρων σε C#

2 ασκήσεις

Σχετικά με την έννοια Καθαρισμός πόρων

Η διεπαφή IDisposable είναι κεντρικής σημασίας για τον καθαρισμό πόρων και έχει δύο σημαντικούς ρόλους στη C#:

  • Δηλώνει στους χρήστες της κλάσης που την υλοποιεί ότι αυτοί είναι υπεύθυνοι να ενημερώσουν την κλάση (καλώντας τη μέθοδο Dispose()) ότι δεν τη χρειάζονται πια, ώστε να μπορέσει να απελευθερώσει τυχόν μη διαχειριζόμενους πόρους ή να επαναφέρει την εσωτερική της κατάσταση όπως αρμόζει. Αυτό έρχεται σε αντίθεση με τη συνηθισμένη προσέγγιση στον καθαρισμό, που αφήνει τον συλλέκτη απορριμμάτων να τα καθαρίσει όλα (κυρίως να ελευθερώσει μνήμη).
  • Σε συνδυασμό με τον μεταγλωττιστή και τον χρόνο εκτέλεσης, η διεπαφή IDisposable υποστηρίζει την using εντολή που συζητείται στην άσκηση resource-lifetime.

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

Η IDisposable συναντάται πιο συχνά σε κλάσεις βιβλιοθηκών που τυλίγουν πόρους του λειτουργικού συστήματος (μη διαχειριζόμενους), όπως οι System.IO.Stream και System.IO.TextReader. (Τα Stream και τα TextReader καλύπτονται σε άλλες ασκήσεις.)

public class TextHandler : IDispoable
{
    private TextReader reader = new TextReader(...);

    public void Dispose()
    {
        reader.Dispose();
    }
}

Αν κάποια κλάση που χρησιμοποιείς υλοποιεί τη διεπαφή IDispoable, τότε πρέπει να διασφαλίσεις ότι θα κληθεί η Dispose() (με χρήση των catch και finally ρητρών) όταν το στιγμιότυπο δεν χρειάζεται πια. Αν μια κλάση έχει κάποιο μέλος που υλοποιεί το IDisposable, τότε πολύ πιθανόν χρειάζεται να υλοποιήσει και η ίδια το IDisposable, ώστε να μπορεί να κληθεί η Dispose() για να αποδεσμευτεί το μέλος που υλοποιεί το IDisposble.

public class Activity : IDisposable
{
    private MyResource myResource;

    public Activity()
    {
        myResource = new MyResource();
    }

    public void Perform()
    {
        try
        {
            myResource.BeUseful();
        }
        catch (Exception)
        {
            myResource.Dispose();
        }
    }

    public void Dispose()
    {
        myResource.Dispose();
    }
}

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

Μοτίβο Dispose

Θα δεις αναφορές στην τεκμηρίωση στο μοτίβο Dispose. Το μοτίβο Dispose περιλαμβάνει την κλήση της Dispose() από τον τελικοποιητή μιας κλάσης και τη διασφάλιση ότι η απόρριψη των πόρων στις βασικές κλάσεις αντιμετωπίζεται σωστά. Το μοτίβο Dispose εξετάζεται σε μεταγενέστερη άσκηση.

Το μοτίβο Dispose αφορά κυρίως μη διαχειριζόμενους πόρους. Αν χρησιμοποιείς τον μηχανισμό P/Inovke και μεθόδους extern, τότε πρέπει να καταλάβεις πώς και πότε να υλοποιήσεις το μοτίβο Dispose. Οι περισσότεροι προγραμματιστές C# σπάνια χρειάζεται να ασχοληθούν άμεσα με μη διαχειριζόμενους πόρους με αυτόν τον τρόπο.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Καθαρισμός πόρων

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 1 ακόμη άσκηση για να εξασκηθείς στην έννοια Καθαρισμός πόρων