dynamisch ist eine neue Funktion von FrameWork 4.0. Das Entstehen von dynamisch hat C# die Eigenschaften eines schwachen Sprachtyps verliehen. Der Compiler prüft den Typ nicht mehr zur Kompilierungszeit, und das dynamische Objekt unterstützt standardmäßig jede gewünschte Funktion während der Kompilierungszeit. Zum Beispiel kannst du, selbst wenn du nichts über das von der Methode GetDynamicObject zurückgegebene Objekt weißt, einen Codeaufruf wie diesen machen, und der Compiler meldet keinen Fehler:
Wenn es um die korrekte Nutzung geht, sollte zuerst eine falsche Verwendung genannt werden:
Oft wird das Stichwort 'var' verwendet, um mit dynamisch zu vergleichen. Tatsächlich sind Var und Dynamik völlig zwei Konzepte und sollten überhaupt nicht miteinander verglichen werden. Nach der Kompilierung stimmt die Kompilierungszeit automatisch mit dem tatsächlichen Typ der VAR-Variable überein und ersetzt die Deklaration der Variablen durch den tatsächlichen Typ, was so aussieht, als würden wir beim Codieren den tatsächlichen Typ deklarieren. Nachdem dynamisch kompiliert wurde, handelt es sich tatsächlich um einen Objekttyp, aber der Compiler behandelt den dynamischen Typ speziell, sodass während der Kompilierung keine Typprüfung durchgeführt wird, sondern die Typprüfung in die Laufzeit gelegt wird.
Dies ist im Editor-Fenster in Visual Studio zu sehen. Als vars deklarierte Variablen unterstützen "intelligent sense", weil Visual Studio den tatsächlichen Typ der var-Typen ableiten kann, während als dynamisch deklarierte Variablen kein "intelligent sense" unterstützen, da der Compiler nichts über den Typ seiner Laufzeit weiß. Die Verwendung von Intelligent Sense für dynamische Variablen zeigt die Aufforderung: "Diese Aktion wird zur Laufzeit aufgelöst."
Die Tatsache, dass die dynamische Variable eine Objektvariable ist, kann durch den IL-Code überprüft werden, und der IL-Code wird hier nicht veröffentlicht. Natürlich verarbeitet der Compiler auch dynamische Deklarationen, um zwischen direkten Objektvariablen zu unterscheiden.
dynamisch wird in MSDN weit verbreitet dargestellt, um die Interoperabilität zu vereinfachen, und ich habe das Gefühl, dass einige Entwickler deshalb missverstanden werden: Da viele Entwickler nicht wissen, wie man Code wie COM+ und OFFICE Sekundärentwicklung verwendet, benötigen sie dringend einen Grund für die dynamische Anwendung. Deshalb denke ich, dass Dynamik in der täglichen Entwicklung wertvoll ist:
Typumbau Der Übergang zwischen dynamischen Instanzen und anderen Instanztypen ist einfach, und Entwickler können problemlos zwischen dynamischen und undynamischen Verhaltensweisen wechseln. Jede Instanz kann implizit in eine dynamische Instanz umgewandelt werden, siehe folgendes Beispiel: dynamisch d1 = 7; dynamisch d2 = "eine Saite"; dynamisch d3 = System.DateTime.Today; dynamisch d4 = System.Diagnostik.Prozess.GetProcesses(); Umgekehrt kann eine implizite Umwandlung dynamisch auf jeden Ausdruck des Typs dynamisch angewendet werden. Und umgekehrt kann jeder Ausdruck des Typs dynamisch auch implizit in andere Typen umgewandelt werden. int i = d1; String str = d2; DateTime dt = d3; System.Diagnostics.Process[] procs = d4; Überlastungsproblem mit dynamischen Typparametern in der Methode Wenn eine Methode ein Objekt vom Typ dynamisch passiert oder das aufgerufene Objekt vom Typ dynamisch ist, erfolgt die Bewertung der Überlastung zur Laufzeit und nicht zur Kompilierungszeit. Dynamische Sprachlaufzeit-DLR Die dynamische Sprachlaufzeit ist . NET Framework 4 Beta 1 ist eine neue Reihe von APIs, die dynamische Typen in C# unterstützen und zudem dynamische Programmiersprachen wie IronPython und IronRuby implementieren. Dynamik vereinfacht Reflexionen.
Früher haben wir Reflexionen wie diese verwendet:
Jetzt haben wir eine vereinfachte Schreibweise:
Wir mögen eine solche Vereinfachung abtun, schließlich scheint der Code nicht stark reduziert worden zu sein, aber wenn wir die beiden Eigenschaften Effizienz und Schönheit berücksichtigen, sind die Vorteile der Dynamik offensichtlich. Der Compiler optimiert die Dynamik, sodass sie viel schneller ist als die Effizienz der ungecachten Reflexion. Wenn du vergleichen musst, kannst du den Code der beiden oben genannten (den Aufruf-Add-Methoden-Teil) für 10000000 ausführen, um eine Schlussfolgerung zu ziehen.
|