var
ist statisch typisiert - der Compiler und die Laufzeit kennen den Typ - sie ersparen Ihnen nur einige Eingaben ... die folgenden sind 100% identisch:
var s = "abc";
Console.WriteLine(s.Length);
und
string s = "abc";
Console.WriteLine(s.Length);
Alles, was passiert ist, war, dass der Compiler herausgefunden hat, dass s
es sich um eine Zeichenfolge handeln muss (vom Initialisierer). In beiden Fällen weiß es (in der IL), dass s.Length
dies die (Instanz-) string.Length
Eigenschaft bedeutet.
dynamic
ist ein ganz anderes Tier; es ist am ähnlichsten object
, aber mit dynamischem Versand:
dynamic s = "abc";
Console.WriteLine(s.Length);
Hier s
wird als dynamisch eingegeben . Er weiß über nicht string.Length
, weil sie nicht wissen , etwas über s
bei der Kompilierung. Zum Beispiel würde Folgendes auch kompiliert (aber nicht ausgeführt):
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
Zur Laufzeit (nur), wäre es überprüft die FlibbleBananaSnowball
Eigenschaft - nicht um es zu finden, und in einem Funkenregen explodieren.
Mit dynamic
werden Eigenschaften / Methoden / Operatoren / usw. zur Laufzeit basierend auf dem tatsächlichen Objekt aufgelöst. Sehr praktisch für Gespräche mit COM (das nur Laufzeit-Eigenschaften haben kann), dem DLR oder anderen dynamischen Systemen wie javascript
.
var
Typen abgeleitet werden können, die aufgrund von Subtypen und impliziten Casts möglicherweise nicht erwünscht sind. Das heißt,var
möglicherweise wurde ein Typ statisch anders als erwartet aufgelöst, wenn implizite Umwandlungen auftreten (insbesondere auf einen allgemeineren Typ, der jedoch nicht darauf beschränkt ist). Ein triviales Beispiel istobject x = ""
vs.var x = ""
vs.var x = "" as object
, aber andere hinterhältigere (und realistischere) Fälle können auftreten und subtile Fehler verursachen.WriteLine
aufgerufen werden muss. Diese "Bindung" erfolgt zur Kompilierungszeit. Im Fall mitdynamic
der Art der.Length
muss sein ,dynamic
auch, und es ist nicht bis zur Laufzeit entschieden wird , die Überlastung (wenn überhaupt) derWriteLine
am besten paßt. Die Bindung erfolgt zur Laufzeit.var
Schlüsselwort in Visual Studio bewegen, wird der tatsächliche Typ angezeigt, der abgeleitet wird. Zeigt an, dass der Typ zur Kompilierungszeit bekannt ist.Mit var deklarierte Variablen sind implizit aber statisch typisiert. Mit dynamic deklarierte Variablen werden dynamisch typisiert. Diese Funktion wurde der CLR hinzugefügt, um dynamische Sprachen wie Ruby und Python zu unterstützen.
Ich sollte hinzufügen, dass dies bedeutet, dass dynamische Deklarationen zur Laufzeit und var- Deklarationen zur Kompilierungszeit aufgelöst werden.
quelle
Ich werde den Unterschied zwischen dynamisch und var erklären .
Das wird funktionieren. Der Compiler kann den Typ der dynamischen Variablen neu erstellen .
Zuerst wird der Typ als Ganzzahl erstellt, und danach wird der Compiler den Typ als Zeichenfolge neu erstellen,
jedoch im Fall von var
quelle
var impliziert, dass die statische Typprüfung (frühe Bindung) angewendet wird. Dynamisch bedeutet, dass die dynamische Typprüfung (späte Bindung) angewendet wird. Beachten Sie in Bezug auf den Code Folgendes:
Wenn Sie dies kompilieren und die Ergebnisse mit ILSpy überprüfen, werden Sie feststellen, dass der Compiler einen späten Bindungscode hinzugefügt hat, der den Aufruf von Hello () von b verarbeitet, während a Hello aufrufen kann, da eine frühe Bindung auf a angewendet wurde () direkt.
zB (ILSpy-Demontage)
Das Beste, was Sie tun können, um den Unterschied zu entdecken, ist, sich eine kleine Konsolen-App wie diese zu schreiben und sie selbst mit ILSpy zu testen.
quelle
Ein großer Unterschied - Sie können einen dynamischen Rückgabetyp haben.
quelle
Hier ist ein einfaches Beispiel, das den Unterschied zwischen Dynamic (4.0) und Var zeigt
Shiva Mamidi
quelle
**
Zeichen im Codebeispiel nur die Betonung anzeigen soll und nicht Teil des echten Arbeitscodes sein soll.var
ist nur eine Abkürzung für eine normale Typdeklaration, bei der Sie den Compiler den richtigen Typ erraten lassen.dynamic
ist ein neuer (statischer) Typ, bei dem alle Überprüfungen zur Laufzeit und nicht vom Compiler durchgeführt werden.quelle
Der Typ einer mit var deklarierten Variablen wird vom Compiler festgelegt. Dies ist eine Verknüpfung zur Angabe des Typnamens, nicht mehr.
Unabhängig davon, wie dynamisch die Laufzeit ist, hat der Compiler keine Ahnung vom tatsächlichen Typ, und alle Methoden- / Feld- / Eigenschaftenzugriffe mit dieser Variablen werden zur Laufzeit ausgearbeitet.
quelle
Dies ist ein schönes Youtube-Video, das mit praktischer Demonstration über
var
VS sprichtDynamic
.Unten finden Sie eine detailliertere Erklärung mit Schnappschuss.
Var wird früh gebunden (statisch überprüft), während dynamisch spät gebunden wird (dynamisch ausgewertet).
Das Schlüsselwort Var betrachtet Ihre Daten auf der rechten Seite und entscheidet dann während der Kompilierungszeit über den Datentyp auf der linken Seite. Mit anderen Worten, das Schlüsselwort var erspart Ihnen nur die Eingabe vieler Dinge. Schauen Sie sich das folgende Bild an, in dem, wenn wir Zeichenfolgendaten angegeben haben und die Variable x den Zeichenfolgendatentyp in meinem Tooltip anzeigt.
Andererseits dient das dynamische Schlüsselwort einem völlig anderen Zweck. Dynamische Objekte werden zur Laufzeit ausgewertet. Zum Beispiel ist im folgenden Code die Eigenschaft "Länge" vorhanden oder wird zur Laufzeit nicht ausgewertet. Ich habe absichtlich ein kleines "l" eingegeben, daher hat dieses Programm gut kompiliert, aber als es tatsächlich ausgeführt wurde, hat es einen Fehler ausgelöst, wenn die Eigenschaft "Länge" wurde genannt (SMALL "l").
quelle
Die dynamische Variable und die Variable var können beide Werttypen speichern, müssen jedoch zum Zeitpunkt der Deklaration 'var' initialisieren.
Der Compiler hat keine Informationen über den Variablentyp 'dynamisch'. var ist compilersicher, dh der Compiler verfügt über alle Informationen zum gespeicherten Wert, sodass zur Laufzeit keine Probleme auftreten.
Der dynamische Typ kann als Funktionsargument übergeben werden und die Funktion kann ihn auch zurückgeben. Der Var-Typ kann nicht als Funktionsargument übergeben werden, und die Funktion kann den Objekttyp nicht zurückgeben. Dieser Variablentyp kann in dem Bereich arbeiten, in dem er definiert wurde.
Im Falle einer dynamischen Umwandlung ist keine Umwandlung erforderlich, aber Sie müssen die Eigenschaften und Methoden in Bezug auf den gespeicherten Typ kennen, während für var keine Umwandlung erforderlich ist, da der Compiler über alle Informationen verfügt, um die Operation auszuführen.
dynamisch: Nützlich beim Codieren mit Reflection oder dynamischer Sprachunterstützung oder mit den COM-Objekten, da weniger Code geschrieben werden muss.
var: Nützlich, wenn Ergebnisse aus den Linq-Abfragen abgerufen werden sollen. In 3.5 Framework wird die Unterstützung der Linq-Funktion eingeführt.
Referenz: Counsellingbyabhi
quelle
quelle
Verwechseln Sie nicht dynamisch und var. Das Deklarieren einer lokalen Variablen mit var ist nur eine syntaktische Verknüpfung, bei der der Compiler den spezifischen Datentyp aus einem Ausdruck ableitet. Das Schlüsselwort var kann nur zum Deklarieren lokaler Variablen innerhalb einer Methode verwendet werden, während das dynamische Schlüsselwort für lokale Variablen, Felder und Argumente verwendet werden kann. Sie können einen Ausdruck nicht in var umwandeln, aber Sie können einen Ausdruck in dynamic umwandeln. Sie müssen eine mit var deklarierte Variable explizit initialisieren, während Sie eine mit dynamic deklarierte Variable nicht initialisieren müssen.
quelle
Beispiel:
Im dynamischen Typ wird der zugrunde liegende Typ jedoch nur zur Laufzeit bestimmt. Der dynamische Datentyp wird zur Kompilierungszeit nicht überprüft und auch nicht stark typisiert. Wir können einen beliebigen Anfangswert für den dynamischen Typ zuweisen und ihn dann einem neuen Typ zuweisen Wert während seiner Lebensdauer.
Beispiel:
Es bietet auch keine IntelliSense-Unterstützung. Es bietet keine bessere Unterstützung, wenn wir auch mit linq arbeiten. Weil es keine Lambda-Ausdrücke, Erweiterungsmethoden und anonymen Methoden unterstützt.
quelle
Hier sind die Unterschiede
var ist statisch typisiert (Kompilierungszeit), dynamic ist dynamisch typisiert (Laufzeit)
Eine als var deklarierte Variable kann nur lokal verwendet werden. Dynamische Variablen können als Parameter an function übergeben werden (Funktionssignatur kann einen Parameter als dynamisch definieren, nicht jedoch als var).
Bei dynamic erfolgt die Auflösung der Eigenschaften zur Laufzeit. Dies ist bei var nicht der Fall. Dies bedeutet, dass zur Kompilierungszeit jede als dynamisch deklarierte Variable eine Methode aufrufen kann, die möglicherweise vorhanden ist oder nicht, sodass der Compiler keinen Fehler auslöst.
Typumwandlung mit var nicht möglich, aber mit dynamisch möglich (Sie können ein Objekt als dynamisch, aber nicht als var umwandeln).
Arun Vijayraghavan
quelle