|
|
Δημοσιεύτηκε στις 7/7/2016 10:15:06 π.μ.
|
|
|

Το dynamic είναι ένα νέο χαρακτηριστικό του FrameWork 4.0. Η εμφάνιση της δυναμικής έχει δώσει στη C# τα χαρακτηριστικά ενός αδύναμου γλωσσικού τύπου. Ο μεταγλωττιστής δεν ελέγχει πλέον τον τύπο κατά τη μεταγλώττιση και το δυναμικό αντικείμενο υποστηρίζει οποιαδήποτε δυνατότητα θέλετε από προεπιλογή κατά τη διάρκεια της μεταγλώττισης. Για παράδειγμα, ακόμα κι αν δεν γνωρίζετε τίποτα για το αντικείμενο που επιστρέφεται με τη μέθοδο GetDynamicObject, μπορείτε να κάνετε μια κλήση κώδικα όπως αυτή και ο μεταγλωττιστής δεν θα αναφέρει σφάλμα:
Όταν πρόκειται για σωστή χρήση, τότε θα πρέπει πρώτα να επισημανθεί μια λανθασμένη χρήση:
Οι άνθρωποι χρησιμοποιούν συχνά τη λέξη-κλειδί var για να συγκρίνουν με τη δυναμική. Στην πραγματικότητα, το var και το δυναμικό είναι εντελώς δύο έννοιες και δεν πρέπει να συγκρίνονται καθόλου μεταξύ τους. Μόλις μεταγλωττιστεί, ο χρόνος μεταγλώττισης ταιριάζει αυτόματα με τον πραγματικό τύπο της μεταβλητής var και αντικαθιστά τη δήλωση της μεταβλητής με τον πραγματικό τύπο, ο οποίος φαίνεται σαν να δηλώνουμε τον πραγματικό τύπο κατά την κωδικοποίηση. Μετά τη μεταγλώττιση του δυναμικού, είναι στην πραγματικότητα ένας τύπος αντικειμένου, αλλά ο μεταγλωττιστής θα κάνει ειδική μεταχείριση του δυναμικού τύπου, έτσι ώστε να μην εκτελεί κανέναν έλεγχο τύπου κατά τη μεταγλώττιση, αλλά να βάζει τον έλεγχο τύπου στο χρόνο εκτέλεσης.
Αυτό μπορεί να φανεί στο παράθυρο του προγράμματος επεξεργασίας στο Visual Studio. Οι μεταβλητές που δηλώνονται ως vars υποστηρίζουν την "έξυπνη αίσθηση" επειδή το Visual Studio μπορεί να συμπεράνει τον πραγματικό τύπο των τύπων var, ενώ οι μεταβλητές που δηλώνονται ως δυναμικές δεν υποστηρίζουν την "έξυπνη αίσθηση" επειδή ο μεταγλωττιστής δεν γνωρίζει τίποτα για τον τύπο του χρόνου εκτέλεσης του. Η χρήση του Intelligent Sense για δυναμικές μεταβλητές ζητά "Αυτή η ενέργεια θα επιλυθεί κατά το χρόνο εκτέλεσης".
Το γεγονός ότι η δυναμική μεταβλητή είναι μεταβλητή αντικειμένου μπορεί να επαληθευτεί από τον κώδικα IL και ο κωδικός IL δεν θα αναρτηθεί εδώ. Φυσικά, ο μεταγλωττιστής χειρίζεται επίσης δυναμικές δηλώσεις για να διακρίνει μεταξύ μεταβλητών άμεσου αντικειμένου.
Το dynamic αποδίδεται ευρέως στο MSDN για να απλοποιήσει τη διαλειτουργικότητα και πιστεύω ότι βασίζεται σε αυτό που ορισμένοι προγραμματιστές παρεξηγούνται: επειδή πολλοί προγραμματιστές δεν ξέρουν πώς να χρησιμοποιούν κωδικοποίηση όπως το COM+ και το OFFICE secondary development, χρειάζονται επειγόντως έναν δυναμικό λόγο εφαρμογής. Έτσι, στην καθημερινή ανάπτυξη, νομίζω ότι η δυναμική είναι πολύτιμη:
Μετατροπή τύπου Η μετάβαση μεταξύ παρουσιών δυναμικού τύπου και άλλων τύπων παρουσιών είναι απλή και οι προγραμματιστές μπορούν εύκολα να κάνουν εναλλαγή μεταξύ δυναμικών και μη δυναμικών συμπεριφορών. Οποιαδήποτε παρουσία μπορεί να μετατραπεί έμμεσα σε παρουσία δυναμικού τύπου, δείτε το ακόλουθο παράδειγμα: δυναμικό d1 = 7; δυναμικό d2 = "μια συμβολοσειρά"; δυναμικό d3 = System.DateTime.Today· δυναμικό d4 = System.Diagnostics.Process.GetProcesses(); Αντίθετα, μια έμμεση μετατροπή μπορεί να εφαρμοστεί δυναμικά σε οποιαδήποτε έκφραση δυναμικού τύπου. Και αντίστροφα, οποιαδήποτε έκφραση δυναμικού τύπου μπορεί επίσης να μετατραπεί σιωπηρά σε άλλους τύπους. int i = d1; συμβολοσειρά str = d2; Ημερομηνία/Ώρα dt = d3; System.Diagnostics.Process[] procs = d4; Πρόβλημα υπερφόρτωσης με παραμέτρους δυναμικού τύπου στη μέθοδο Εάν μια μέθοδος καλείται να περάσει ένα αντικείμενο δυναμικού τύπου ή το αντικείμενο που καλείται είναι δυναμικού τύπου, τότε η κρίση της υπερφόρτωσης συμβαίνει κατά το χρόνο εκτέλεσης και όχι κατά το χρόνο μεταγλώττισης. DLR χρόνου εκτέλεσης δυναμικής γλώσσας Ο χρόνος εκτέλεσης δυναμικής γλώσσας είναι . Το NET Framework 4 Beta 1 είναι ένα νέο σύνολο API που παρέχουν υποστήριξη για δυναμικούς τύπους σε C# και εφαρμόζουν επίσης δυναμικές γλώσσες προγραμματισμού όπως IronPython και IronRuby. Η δυναμική απλοποιεί τις αντανακλάσεις.
Προηγουμένως χρησιμοποιούσαμε αντανακλάσεις όπως αυτή:
Τώρα έχουμε έναν απλοποιημένο τρόπο να γράψουμε:
Μπορεί να απορρίπτουμε μια τέτοια απλοποίηση, άλλωστε φαίνεται ότι ο κώδικας δεν έχει μειωθεί πολύ, αλλά αν λάβουμε υπόψη τα δύο χαρακτηριστικά της αποτελεσματικότητας και της ομορφιάς, τότε τα πλεονεκτήματα της δυναμικής είναι προφανή. Ο μεταγλωττιστής βελτιστοποιεί τη δυναμική ώστε να είναι πολύ πιο γρήγορη από την αποτελεσματικότητα ανάκλασης χωρίς προσωρινή αποθήκευση. Εάν πρέπει να συγκρίνετε, μπορείτε να εκτελέσετε τον κώδικα των δύο παραπάνω (το τμήμα κλήσης Προσθήκη μεθόδου) για 1000000 για να βγάλετε ένα συμπέρασμα.
|
Προηγούμενος:Το mvc ανακτά τα δεδομένα JSON XML για την καταχώρησηΕπόμενος:Παρουσιάστηκε σφάλμα αναγνώρισης. κοντά στη γραμμή 1, στήλη 10
|