Το .ctor είναι γνωστό σε όλους
Το .cctor δεν είναι οικείο και μπορεί εύκολα να γίνει κατάχρηση
Το λεγόμενο .cctor είναι ένας στατικός κατασκευαστής στη σύνταξη C#
Σχήμα σαν
Ομοιότητες και διαφορές μεταξύ .cctor και .ctor
1. Δεν μπορείτε να έχετε αναγνωριστικά δικαιωμάτων πρόσβασης δημόσια, ιδιωτικά κ.λπ., τα οποία δεν μπορούν να χρησιμοποιηθούν, τα οποία διαφέρουν από το .ctor
2. Δεν πρέπει να υπάρχει τιμή επιστροφής, η οποία είναι ίδια με το .ctor
3. Δεν μπορεί να υπάρχουν παράμετροι, το .ctor μπορεί να έχει πολλές παραμέτρους
4. Μπορεί να υπάρχει μόνο ένα το πολύ, και πρέπει να υπάρχει τουλάχιστον ένα .ctor
5. Ο προγραμματιστής δεν μπορεί να ελέγξει το χρονισμό της κλήσης .cctor, κατά μία έννοια, ο προγραμματιστής μπορεί να ελέγξει το χρονισμό της κλήσης του
6. Οι προγραμματιστές δεν μπορούν να καλέσουν απευθείας .cctor, .ctor Όταν ο προγραμματιστής χρησιμοποιεί τον νέο χειριστή, σίγουρα θα κληθεί .ctor
Χρονισμός κλήσης .cctor:
Ο στατικός κατασκευαστής καλείται αυτόματα πριν από τη δημιουργία της πρώτης παρουσίας ή την αναφορά οποιουδήποτε στατικού μέλους. (Αυτό είναι το αρχικό απόσπασμα στο MSDN)
Είναι σαφές ότι το .cctor καλείται μόνο μία φορά στον ίδιο τομέα προγράμματος, αντί να καλείται κάθε φορά που δημιουργείται ένα αντικείμενο όπως το .ctor
Χρήση .cctor
Οι στατικοί κατασκευαστές χρησιμοποιούνται για την προετοιμασία οποιωνδήποτε στατικών δεδομένων ή για την εκτέλεση συγκεκριμένων λειτουργιών που χρειάζεται να εκτελεστούν μόνο μία φορά.
Για παράδειγμα:
Όλος ο παρακάτω κώδικας μεταγλωττίζεται στα Windows 7, έναντι της λειτουργίας έκδοσης 2005 και εάν τα αποτελέσματα είναι διαφορετικά, εξετάστε το ενδεχόμενο να μεταβείτε στη λειτουργία απελευθέρωσης και να προσπαθήσετε ξανά
Μεταγλωττίστε αυτό το τμήμα κώδικα και, στη συνέχεια, χρησιμοποιήστε το ILDISM για να το προβάλετε, ο πίνακας μεθόδων έχει ως εξής
.ctor(): void // Αυτός είναι ένας κατασκευαστής στιγμιότυπου της κλάσης που παρέχεται αυτόματα από τον μεταγλωττιστή
Main():void(string[]) //Σημείο εισόδου προγράμματος
Προφανώς, δεν υπάρχει .cctor στη συναρμολόγηση και ο μεταγλωττιστής δεν θα παρέχει αυτόματα συναρτήσεις .cctor όταν μια κλάση δεν έχει στατικά πεδία που πρέπει να αρχικοποιηθούν, κάτι που είναι διαφορετικό από το .ctor, το οποίο υπάρχει πάντα ούτως ή άλλως
Τροποποίηση του κώδικα
Κατά τη σύνταξη αυτού του κώδικα, θα υπάρξει μια προειδοποίηση, αλλά αυτό δεν είναι σημαντικό, το σημαντικό είναι ότι κατά την προβολή της διάταξης με το ILDASTOM, δεν εμφανίζεται το αναμενόμενο .cctor, στατικός κατασκευαστής!
Τι συνέβη;?
Είναι λάθος το συμπέρασμα;. Το CCTOR δεν είναι ένα στατικό πεδίο που χρησιμοποιείται για την προετοιμασία μιας κλάσης;
Πάρτε το χαλαρά, ρίξτε μια ματιά στον κώδικα
Η μόνη διαφορά μεταξύ αυτού του κώδικα και του προηγούμενου είναι ότι αλλάζει την αρχική τιμή του στατικού πεδίου i και το επόμενο πράγμα είναι να παρακολουθήσετε τη μαγική στιγμή
Ας το DASM και προς έκπληξή μας, το πολυπόθητο .cctor είναι επιτέλους εδώ!
Κοιτάξτε τον κώδικα υλοποίησης .cctor και θα δείτε:
.method private hidebysig specialname rtspecialname static void .cctor() cil managed
{ Κωδικός μέγεθος 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Στιγμιαία στατικά πεδία :-) IL_0001: STSFLD INT32 only_lonely. Α::εγώ IL_0006: ret } // τέλος της μεθόδου A::.cctor
Γιατί συμβαίνει αυτό; Ο πιθανός λόγος είναι ότι η προεπιλεγμένη τιμή του τύπου Int32 είναι 0 και ο μεταγλωττιστής το εντοπίζει και το βελτιστοποιεί ώστε να μην παράγει κώδικα .cctor
αναφορά
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Τέλος, μπορούμε να υλοποιήσουμε μόνοι μας μια συνάρτηση .cctor για να υλοποιήσουμε ειδικές λειτουργικές απαιτήσεις
περίληψη 1、. Το CTOR είναι η μέθοδος κατασκευής. 2、. Το cctor είναι ένας αρχικοποιητής τύπου, ο οποίος είναι ένας στατικός κατασκευαστής στη C#. 3. Όταν δημιουργηθεί η κλάση C, θα εκχωρήσει πρώτα μια τιμή στο πεδίο που έχει εκχωρηθεί τη στιγμή της δήλωσης και, στη συνέχεια, θα καλέσει τον κατασκευαστή της βασικής κλάσης και, στη συνέχεια, θα κατασκευαστεί με τον ίδιο τρόπο, μέχρι το System.Object ανώτατου επιπέδου και, στη συνέχεια, θα επιστρέψει για να εκτελέσει τον κώδικα στη ρητή μέθοδο κατασκευής του C, η οποία είναι μια τόσο αναδρομική διαδικασία.
|