Πώς φαίνεται η οδηγία using μετά τη μεταγλώττιση;
sobes.tech AI
Απάντηση από AI
Η οδηγία using από μόνη της δεν παράγει εκτελέσιμο κώδικα. επεξεργάζεται από τον μεταγλωττιστή στο στάδιο της μεταγλώττισης και χρησιμοποιείται για διάφορους σκοπούς:
-
Ενδείξεις των χρησιμοποιούμενων χώρων ονομάτων (usings for namespaces): Επιτρέπει τη χρήση τύπων από τους καθορισμένους χώρους ονομάτων χωρίς το πλήρες εξειδικευμένο όνομα. Μετά τη μεταγλώττιση, οι αναφορές στους τύπους στον κώδικα IL θα περιέχουν τα πλήρη εξειδικευμένα ονόματα (χώρος ονομάτων + όνομα τύπου).
// Πριν από τη μεταγλώττιση: using System; // χρήση της κλάσης Console χωρίς προσδιορισμό Console.WriteLine("Hello"); // Μετά τη μεταγλώττιση (στον κώδικα IL): // κλήση της μεθόδου System.Console::WriteLine(string) -
Ψευδώνυμα για χώρους ονομάτων ή τύπους (using aliases): Δημιουργεί ένα πιο σύντομο όνομα για έναν χώρο ονομάτων ή τύπο. Στον κώδικα IL, χρησιμοποιούνται τα αρχικά πλήρη ονόματα, όχι τα ψευδώνυμα.
// Πριν από τη μεταγλώττιση: using MyCustomType = MyProject.MyNamespace.SomeVeryLongTypeName; MyCustomType instance = new MyCustomType(); // Μετά τη μεταγλώττιση (στον κώδικα IL): // δημιουργία ενός στιγμιότυπου του MyProject.MyNamespace.SomeVeryLongTypeName -
Static using (using static): Επιτρέπει την άμεση κλήση στατικών μελών ενός τύπου χωρίς να καθορίζεται το όνομα του τύπου. Στον κώδικα IL, η κλήση θα περιέχει το πλήρες όνομα του τύπου και της στατικής μεθόδου.
// Πριν από τη μεταγλώττιση: using static System.Math; double result = Sqrt(16.0); // χρήση Math.Sqrt // Μετά τη μεταγλώττιση (στον κώδικα IL): // κλήση της στατικής μεθόδου System.Math::Sqrt(double) -
using-οδηγία (Statement block): Διασφαλίζει τη σωστή απελευθέρωση πόρων που υλοποιούν τη διεπαφήIDisposable. Ο μεταγλωττιστής δημιουργεί ένα μπλοκtry...finallyπου καλεί τη μέθοδοDispose()του αντικειμένου.// Πριν από τη μεταγλώττιση: using (var stream = new System.IO.FileStream("file.txt", System.IO.FileMode.Open)) { // εργασία με το ρεύμα } // καλείται το Dispose() εδώ // Μετά τη μεταγλώττιση (παράδειγμα στον κώδικα IL): /* .try { // δημιουργία του αντικειμένου stream // εργασία με το ρεύμα } finally { // έλεγχος για null και κλήση stream.Dispose() } */
Έτσι, οι οδηγίες using δεν παραμένουν στον μεταγλωττισμένο κώδικα ως τέτοιες. Επηρεάζουν το πώς ο μεταγλωττιστής επιλύει τα ονόματα τύπων και μελών (για τις πρώτες τρεις περιπτώσεις) και πώς δημιουργεί τον κώδικα για τη διαχείριση πόρων (για την τελευταία περίπτωση).