resource-cleanup χρησιμοποιεί τη διεπαφή IDispose για να δηλώσει ότι ο πόρος κάποιου αντικειμένου ή άλλη κατάσταση του προγράμματος έπρεπε να απελευθερωθεί ή να επαναφερθεί όταν το αντικείμενο δεν ήταν πλέον απαραίτητο (και ότι η εξάρτηση από τον συλλέκτη απορριμμάτων δεν θα το πετύχαινε αυτό ούτε θα παρείχε το απαιτούμενο επίπεδο ελέγχου) και ότι η μέθοδος IDisposable.Dispose() ήταν το φυσικό σημείο για τέτοιες εργασίες καθαρισμού.
Υπάρχει και μια άλλη δομή, το μπλοκ using, που επιτρέπει, από τη σκοπιά του καλούντος, να συγκεντρωθεί σε μία μόνο εντολή όλη η διαχείριση της διάρκειας ζωής των πόρων.
using (var file = new File("my_secrets"))
{
file.WriteSecret("xxxxxxx");
}
Στο παραπάνω παράδειγμα, οι πόροι του συστήματος αρχείων που σχετίζονται με το file θα απελευθερωθούν και θα επιστραφούν στο λειτουργικό σύστημα όταν βγούμε από το μπλοκ using.
Για να λειτουργήσει αυτό το μοτίβο, η μεταβλητή στην εντολή using πρέπει να είναι τύπου αναφοράς που υλοποιεί τη διεπαφή IDisposable και πρέπει να απελευθερώνει πόρους/να επαναφέρει την κατάσταση του προγράμματος στη μέθοδο Dispose() της.
Η C# 8 εισάγει μια βελτίωση σε αυτό το μοτίβο. Μια εντολή using μπορεί να τοποθετηθεί στην αρχή ενός μπλοκ.
using var drawingResource = some_provided_or_new_object;
try
{
drawingResource.DrawSomething();
}
catch (Exception)
{
throw;
}
Οι προγραμματιστές Java μπορούν να το αναγνωρίσουν ως ανάλογο του μηχανισμού αυτόματης διαχείρισης πόρων που εισήχθη στη Java 7.
Δουλεύεις και πάλι πάνω στο σύστημα ORM (Object Relationship Mapping) που παρουσιάστηκε στο object-relational-mapping.
Η ανάλυση της χρήσης του ORM δείχνει ότι το 95% των συναλλαγών εκτελείται μέσα από μία μόνο μέθοδο, και αποφασίστηκε ότι θα ήταν πιο σωστό να υπάρχει μία μόνο μέθοδος του ORM που να ανοίγει, να γράφει και να ολοκληρώνει μια συναλλαγή.
Η βάση δεδομένων έχει τις εξής μεθόδους στιγμιοτύπου:
Database.BeginTransaction() ξεκινά μια συναλλαγή στη βάση δεδομένων.Database.Write(string data) γράφει δεδομένα στη βάση δεδομένων μέσα στη συναλλαγή. Αν λάβει εσφαλμένα δεδομένα, πετάει μια εξαίρεση. Αν προσπαθήσεις να καλέσεις αυτή τη μέθοδο χωρίς να έχει κληθεί πρώτα η BeginTransaction(), θα πεταχτεί μια εξαίρεση. Αν πετύχει, η εσωτερική κατάσταση της βάσης δεδομένων αλλάζει σε DataWritten.Database.EndTransaction() ολοκληρώνει τη συναλλαγή στη βάση δεδομένων. Μπορεί να πετάξει μια εξαίρεση αν δεν μπορεί να κλείσει τη συναλλαγή ή αν δεν έχει κληθεί η Database.BeginTransaction().Database.Dispose() καθαρίζει τη βάση δεδομένων αν πεταχτεί κάποια εξαίρεση στη διάρκεια μιας συναλλαγής. Αυτό αλλάζει την κατάσταση της βάσης δεδομένων σε Closed.Υλοποίησε τη μέθοδο Orm.Write() ώστε να ξεκινά μια συναλλαγή στη βάση δεδομένων, να γράφει τα δεδομένα που της περνάς και να ολοκληρώνει τη συναλλαγή. Όλες οι εξαιρέσεις, συμπεριλαμβανομένης της InvalidOperationException, πρέπει να περνούν στον καλούντα χωρίς να καταγραφούν ή να υπάρξει οποιαδήποτε άλλη παρέμβαση.
Database db = new Database();
Orm orm = new Orm(db);
orm.Write("good write");
// => database has an internal state of State.Closed
orm.Write("bad write");
// => an exception is thrown but database is left with an internal state of State.Closed
orm.Write("bad commit");
// => an exception is thrown but database is left with an internal state of State.Closed
Έχουν περάσει μερικοί μήνες από τότε που παρουσιάστηκε η Orm.Write() και υπάρχει διχογνωμία στην ομάδα. Πολλοί προγραμματιστές θα ήθελαν το ORM να χειρίζεται τα σφάλματα όταν πετιούνται εξαιρέσεις και απλώς να επιστρέφει στον καλούντα μια ένδειξη επιτυχίας.
Υλοποίησε τη μέθοδο Orm.WriteSafely() ώστε να ξεκινά μια συναλλαγή στη βάση δεδομένων, να γράφει τα δεδομένα που της περνάς και να ολοκληρώνει τη συναλλαγή (όπως παραπάνω). Πρέπει να επιστρέφει true αν η εγγραφή πέτυχε, αλλιώς false. Μην προσπαθήσεις να καταγράψεις την εξαίρεση.
Database db = new Database();
Orm orm = new Orm(db);
orm.WriteSafely("good write");
// => true
orm.WriteSafely("bad write");
// => false
orm.WriteSafely("bad commit");
// => false
Γράψου στο Exercism για να μάθεις και να κατακτήσεις C# με 62 έννοιες178 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.