Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 31028|Απάντηση: 1

[Πηγή] .ctor και .cctor του .net

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 6/4/2017 2:56:38 μ.μ. | | | |
Το .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, η οποία είναι μια τόσο αναδρομική διαδικασία.





Προηγούμενος:Γενικά αντικείμενα συνδεδεμένα με περιβάλλον: Το ContextBoundObject και οι γενικές δεν υποστηρίζονται
Επόμενος:Περίληψη της σειράς εκτέλεσης στατικών, μη στατικών και εποικοδομητικών μεθόδων σε μια κλάση
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com