Heim > Artikel > Backend-Entwicklung > Richtige Verwendung von Dynamik in C#
Dynamic ist eine neue Funktion von FrameWork4.0. Das Aufkommen der Dynamik verleiht C# die Merkmale schwacher Sprachtypen. Der Compiler überprüft den Typ während der Kompilierung nicht mehr und das dynamische Standardobjekt zur Kompilierungszeit unterstützt alle gewünschten Funktionen. Selbst wenn Sie beispielsweise nichts über das von der GetDynamicObject-Methode zurückgegebene Objekt wissen, können Sie den Code dennoch wie folgt aufrufen, und der Compiler meldet keinen Fehler:
dynamic dynamicObject = GetDynamicObject(); Console.WriteLine(dynamicObject.Name); Console.WriteLine(dynamicObject.SampleMethod());
Apropos korrekte Verwendung, Sie sollte zunächst auf eine falsche Verwendung hinweisen:
Menschen vergleichen das Schlüsselwort var oft mit Dynamic. Tatsächlich sind Var und Dynamic zwei völlig unterschiedliche Konzepte und sollten überhaupt nicht miteinander verglichen werden. Var ist eigentlich der „Syntax-Zucker“, der uns zur Kompilierungszeit zugeworfen wird. Nach der Kompilierung passt sich die Variable automatisch dem tatsächlichen Typ an und ersetzt die Deklaration der Variablen durch den tatsächlichen Typ Es wird mit dem tatsächlichen Typ deklariert. Nach der Kompilierung von Dynamic handelt es sich tatsächlich um einen Objekttyp. Der Compiler führt jedoch eine spezielle Verarbeitung des dynamischen Typs durch, sodass während der Kompilierung keine Typprüfung durchgeführt wird, sondern die Typprüfung zur Laufzeit erfolgt.
Dies ist im Editorfenster von Visual Studio zu sehen. Mit var deklarierte Variablen unterstützen „Intelligent Sensing“, da Visual Studion auf den tatsächlichen Typ des Var-Typs schließen kann. Mit Dynamic deklarierte Variablen unterstützen jedoch nicht „Intelligent Sensing“, da der Compiler nichts über seinen Laufzeittyp weiß. Wenn Sie „Intelligence Sense“ für dynamische Variablen verwenden, wird die Meldung „Dieser Vorgang wird zur Laufzeit aufgelöst“ angezeigt.
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 direkte Objektvariablen zu unterscheiden.
Dynamik wird in MSDN als Möglichkeit zur Vereinfachung der Interoperabilität weithin übertrieben. Ich habe das Gefühl, dass dies von einigen Entwicklern missverstanden wird: weil viele Entwickler keinen Zugriff auf die sekundäre COM+- und OFFICE-Klasse haben Codierung, daher ist ein dynamischer Anwendungsgrund dringend erforderlich. Daher denke ich, dass das Wertvollste an Dynamik in der täglichen Entwicklung ist:
Typkonvertierung
Die Konvertierung zwischen Instanzen des dynamischen Typs und Instanzen anderer Typen ist sehr einfach und Entwickler können dies tun Wechseln Sie problemlos zwischen dynamischem und nicht dynamischem Verhalten. Jede Instanz kann implizit in eine Instanz des dynamischen Typs konvertiert werden, siehe folgendes Beispiel:
dynamic d1 = 7;
dynamic d2 = "a string";
dynamic d3 = System.DateTime.Today;
dynamic d4 = System.Diagnostics.Process.GetProcesses();
Umgekehrt kann eine implizite Konvertierung dynamisch auf jeden Ausdruck vom Typ „dynamic“ angewendet werden.
Umgekehrt kann jeder Ausdruck vom Typ „dynamic“ auch implizit in andere Typen konvertiert werden.
int i = d1;
string str = d2;
DateTime dt = d3;
System.Diagnostics.Process[] procs = d4;
Überladungsprobleme bei Methoden, die dynamische Typparameter enthalten
Wenn eine Methode aufgerufen und ein Objekt vom dynamischen Typ übergeben wird oder das aufgerufene Objekt vom dynamischen Typ ist, dann lautet die Überladungsbeurteilung „Passiert“. zur Laufzeit und nicht zur Kompilierungszeit.
Dynamic Language Runtime DLR (Dynamic Language Runtime DLR)
Dynamic Language Runtime ist ein neuer Satz von APIs in .NET Framework 4 Beta 1, der den Zugriff auf dynamische Typen in c# unterstützt und implementiert dynamische Programmiersprachen wie IronPython und IronRuby.
Dynamik kann die Reflexion vereinfachen.
Früher haben wir die Reflexion so verwendet:
public class DynamicSample { public string Name { get; set; } public int Add(int a, int b) { return a + b; } } DynamicSample dynamicSample = new DynamicSample(); //create instance为了简化演示,我没有使用反射 var addMethod = typeof(DynamicSample).GetMethod("Add"); int re = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });
Jetzt haben wir eine vereinfachte Schreibweise:
dynamic dynamicSample2 = new DynamicSample(); int re2 = dynamicSample2.Add(1, 2);
Damit sind wir möglicherweise nicht einverstanden Vereinfachung, siehe schließlich Der Code scheint nicht viel reduziert zu sein, aber wenn wir die beiden Merkmale Effizienz und Eleganz berücksichtigen, werden die Vorteile der Dynamik sichtbar. Der Compiler optimiert die Dynamik, was viel schneller ist als die Reflexion ohne Zwischenspeicherung. Wenn Sie vergleichen müssen, können Sie die beiden oben genannten Codes (den Teil, der die Add-Methode aufruft) 1.000.000 Mal ausführen, um eine Schlussfolgerung zu ziehen.