Ποια είναι η διαφορά μεταξύ κατασκευαστή και καταστροφέα στην C #;


Απάντηση 1:

Το C # δεν έχει καταστροφές, έχει finalizers, το οποίο είναι διαφορετικό.

Ουσιαστικά, ένας κατασκευαστής είναι αυτό που ονομάζεται από τη λέξη "νέος" και στις γλώσσες που τις έχουν, οι καταστροφείς ονομάζονται από τη λέξη-κλειδί "διαγραφή" (ή όταν το αντικείμενο βγαίνει από το πεδίο εφαρμογής).

Από την άλλη πλευρά, ένας τελικοποιητής ονομάζεται από τον συλλέκτη απορριμμάτων, λίγο μετά το σβήσιμο του αντικειμένου ή το πεδίο εφαρμογής (τεχνικά όταν δεν υπάρχουν πια δείκτες που να μην είναι επίσης "εκτός πεδίου").

Δύο σημαντικά πράγματα που πρέπει να σημειωθούν σχετικά με τους φινιριστές:

  • Δεν έχετε τρόπο να γνωρίζετε ακριβώς πότε θα ονομάζεταιΕπρεπε να είστε προσεκτικοί σχετικά με το τι κάνετε σε έναν finalizer - άλλα αντικείμενα ib της ίδιας τάξης μπορεί να έχουν ήδη συλλεχθεί σκουπίδια. Θα πρέπει να αγγίξετε μόνο τις μη διαχειριζόμενες αναφορές σε ένα Finalizer.

Αν θέλετε / χρειάζεστε κάτι πιο κοντά σε έναν καταστροφικό στο C #, έχετε την IDis διαθέσιμη διασύνδεση, η οποία παρέχει μια μέθοδο? "Διαθέτω".

Το C # έχει μια ειδική λέξη-κλειδί "χρήση", που δηλώνει ένα αντικείμενο σε ένα εύρος και εγγυάται ότι ονομάζεται η μέθοδος απόρριψης.

Αυτή η μέθοδος θα πρέπει επίσης να διαθέτει οποιαδήποτε IDisposable αντικείμενα που διαθέτει η κλάση implenting.

Αν η κλάση διατηρεί μη διαχειριζόμενα αντικείμενα, θα πρέπει να δημιουργήσετε μια υπερφόρτωση της μεθόδου Dispose, η οποία λαμβάνει μια παράμετρο boolean. Αυτή η μέθοδος θα πρέπει να διαθέτει όλες τις αναλλοίωτες αναφορές και εάν η παράμετρος bool είναι αληθής, θα πρέπει επίσης να διαθέτει όλα τα αντικείμενα που μπορούν να χρησιμοποιηθούν. Στη συνέχεια, θα πρέπει να δημιουργήσετε έναν finalizer, ο οποίος καλεί Dispose (false) για να εξασφαλίσετε ότι οι ανεξέλεγκτοι πόροι απελευθερώνονται σε περίπτωση που η μέθοδος dispose δεν κλήθηκε ποτέ. Η κανονική απόρριψη θα πρέπει να καλέσει το Dispose (true) και επίσης να καλέσει το GC.SurpressFinalize (), αφού η ολοκλήρωση δεν θα είναι απαραίτητη (αυτό εξασφαλίζει ότι το αντικείμενο συλλέγεται σκουπίδια πιο γρήγορα και βοηθά στην αποφυγή σφαλμάτων στον finalizer)


Απάντηση 2:

Ο Κατασκευαστής και ο Καταστροφέας είναι ειδική συνάρτηση μέλους της τάξης σε όλες τις γλώσσες προγραμματισμού όπως c # ή Java. Οι λειτουργίες των μελών αυτών έχουν το ίδιο όνομα με το όνομα κλάσης και χρησιμοποιούνται όταν δημιουργούμε ένα αντικείμενο μιας κλάσης.

Ο βασικός κατασκευαστής χρησιμοποιείται για την αρχικοποίηση στοιχείων δεδομένων μιας κλάσης και ο καταστροφέας χρησιμοποιείται για να καταστρέψει τα αντικείμενα ή να απελευθερώσει τις μνήμες που καταλαμβάνει το αντικείμενο.

Μια χρήση του κατασκευαστή σε πραγματικό χρόνο είναι να αρχικοποιήσει τα στοιχεία δεδομένων με προεπιλεγμένες τιμές και γι 'αυτό έχουμε προεπιλεγμένο κατασκευαστή.

Για παράδειγμα, κάθε φορά που δημιουργούμε email που είχα από οποιοδήποτε τομέα όπως το Gmail, το yahoo ή η Microsoft, έχουμε κάποια προεπιλεγμένα μηνύματα ηλεκτρονικού ταχυδρομείου στα εισερχόμενά μας, πράγμα που σημαίνει ότι αυτά τα μηνύματα ηλεκτρονικού ταχυδρομείου είναι προεπιλεγμένες τιμές.

Για να το καταλάβετε καλύτερα, θεωρήστε το Gmail ως τάξη.

class Gmail
{
 μήνυμα συμβολοσειράς.
 δημόσιο Gmail (όνομα χρήστη)
 {
   message = "Καλώς ορίσατε στο Gmail" + Όνομα χρήστη
 }}
}}
Στην κύρια λειτουργία
Gmail g1 = νέο Gmail ("Shinchan.gupta");
Gmail g2 = νέο Gmail ("aching.gupta");

Τώρα όποτε δημιουργούμε ένα νέο id ηλεκτρονικού ταχυδρομείου σημαίνει ότι δημιουργούμε ένα νέο αντικείμενο του Gmail. Και θα προετοιμάσει τα μέλη δεδομένων μηνυμάτων με προεπιλεγμένες τιμές για όλο το αντικείμενο και γι 'αυτό κάθε χρήστης του gmail παίρνει το ίδιο μήνυμα στα εισερχόμενα και ποιο είναι το προεπιλεγμένο μήνυμα που μπορείτε να πείτε.

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

Με απλή λέξη, όταν χρησιμοποιείτε τον κατασκευαστή, εκχωρεί μνήμη και όταν χρησιμοποιείτε τον destructor απελευθερώνει την μνήμη που έχει διατεθεί.