var
est de type statique - le compilateur et le runtime connaissent le type - ils vous font juste économiser du texte ... les éléments suivants sont 100% identiques:
var s = "abc";
Console.WriteLine(s.Length);
et
string s = "abc";
Console.WriteLine(s.Length);
Tout ce qui s'est passé, c'est que le compilateur a compris qu'il s
devait s'agir d'une chaîne (à partir de l'initialiseur). Dans les deux cas, il sait (dans l'IL) que cela s.Length
signifie la string.Length
propriété (instance) .
dynamic
est une bête très différente; il est le plus similaire object
, mais avec une répartition dynamique:
dynamic s = "abc";
Console.WriteLine(s.Length);
Ici, s
est tapé comme dynamique . Il ne sait pas string.Length
, parce qu'il ne sait pas quoi que ce soit au sujet s
au moment de la compilation. Par exemple, les éléments suivants compileraient (mais ne s'exécuteraient pas) également:
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
Lors de l'exécution (uniquement), il vérifierait la FlibbleBananaSnowball
propriété - ne la trouverait pas et exploserait dans une pluie d'étincelles.
Avec dynamic
, les propriétés / méthodes / opérateurs / etc sont résolus au moment de l'exécution , en fonction de l'objet réel. Très pratique pour parler à COM (qui peut avoir des propriétés d'exécution uniquement), au DLR ou à d'autres systèmes dynamiques, comme javascript
.
var
peut parfois déduire des types qui pourraient ne pas être souhaités en raison de sous-types et de transtypages implicites. Autrement dit,var
peut avoir résolu un type statiquement différent de celui attendu lorsque des conversions implicites se produisent (notamment vers un type plus général, mais ce n'est pas limité à cela). Un exemple trivial estobject x = ""
vsvar x = ""
vsvar x = "" as object
, mais d'autres cas plus sournois (et réalistes) peuvent se produire et provoquer des bugs subtils.WriteLine
appeler. Cette "liaison" se produit au moment de la compilation. Dans le cas dedynamic
, le type de.Length
doitdynamic
également l' être , et ce n'est qu'au moment de l'exécution qu'il est décidé quelle surcharge (le cas échéant)WriteLine
convient le mieux. La liaison se produit au moment de l'exécution.var
mot clé dans Visual Studio, le type réel s'affiche qui est déduit. Vous indique que le type est connu au moment de la compilation.Les variables déclarées avec var sont implicitement mais statiquement typées. Les variables déclarées avec dynamic sont typées dynamiquement. Cette capacité a été ajoutée au CLR afin de prendre en charge les langages dynamiques comme Ruby et Python.
Je dois ajouter que cela signifie que les déclarations dynamiques sont résolues au moment de l'exécution, les déclarations var sont résolues au moment de la compilation.
la source
Je vais expliquer la différence entre dynamique et var .
Cela fonctionnera. le compilateur peut recréer le type de variable dynamique .
il crée d'abord le type sous forme d' entier et ensuite le compilateur recrée le type sous forme de chaîne
mais en cas de var
la source
var implique que la vérification de type statique (liaison anticipée) est appliquée. dynamique implique que la vérification de type dynamique (liaison tardive) est appliquée. En termes de code, considérez ce qui suit:
Si vous compilez cela et inspectez les résultats avec ILSpy, vous constaterez que le compilateur a ajouté du code de liaison tardive qui gérera l'appel à Hello () de b, alors que, car une liaison précoce a été appliquée à a, a est capable d'appeler Hello () directement.
par exemple (démontage ILSpy)
La meilleure chose que vous puissiez faire pour découvrir la différence est de vous écrire une petite application console comme celle-ci et de la tester vous-même avec ILSpy.
la source
Une grande différence - vous pouvez avoir un type de retour dynamique.
la source
Voici un exemple simple qui montre la différence entre Dynamic (4.0) et Var
Shiva Mamidi
la source
**
caractères dans l'exemple de code est destinée à indiquer uniquement l'accent et n'est pas destinée à faire partie du vrai code de travail.var
est juste un raccourci pour une déclaration de type normal, où vous laissez le compilateur deviner le type correct.dynamic
est un nouveau type (statique), où toutes les vérifications sont effectuées au moment de l'exécution, et non par le compilateur.la source
Le type d'une variable déclarée avec var est déterminé par le compilateur, c'est un raccourci pour spécifier le nom du type, rien de plus.
Quelle que soit la dynamique déterminée lors de l'exécution, le compilateur n'a aucune idée du type réel et tous les accès aux méthodes / champs / propriétés avec cette variable seront élaborés lors de l'exécution.
la source
Ceci est une belle vidéo youtube qui parle de
var
VSDynamic
avec une démonstration pratique.Voici une explication plus détaillée avec un instantané.
Var est lié tôt (vérifié statiquement) tandis que dynamique est lié tardivement (évalué dynamiquement).
Le mot-clé var examine vos données de droite, puis pendant la compilation, il décide du type de données de gauche. En d'autres termes, le mot-clé var vous évite de taper beaucoup de choses. Jetez un oeil à l'image ci-dessous où lorsque nous avons donné des données de chaîne et la variable x montre le type de données de chaîne dans mon info-bulle.
D'un autre côté, le mot-clé dynamique a un objectif complètement différent. Les objets dynamiques sont évalués pendant l'exécution. Par exemple, dans le code ci-dessous, la propriété "Length" existe ou non est évaluée pendant l'exécution. J'ai délibérément tapé un petit "l", donc ce programme a compilé très bien mais quand il a été exécuté, il a généré une erreur lorsque la propriété "length" a été appelé (SMALL "l").
la source
La variable dynamique et la variable var peuvent toutes deux stocker n'importe quel type de valeur, mais il est nécessaire d'initialiser 'var' au moment de la déclaration.
Le compilateur ne possède aucune information sur le type de variable «dynamique». var est sûr pour le compilateur, c'est-à-dire que le compilateur a toutes les informations sur la valeur stockée, de sorte qu'il ne cause aucun problème au moment de l'exécution.
Le type dynamique peut être passé comme argument de fonction et la fonction peut également le renvoyer. Le type de var ne peut pas être passé comme argument de fonction et la fonction ne peut pas retourner le type d'objet. Ce type de variable peut fonctionner dans la portée où il a été défini.
En cas de Casting dynamique n'est pas nécessaire, mais vous devez connaître la propriété et les méthodes liées au type stocké, tandis que pour var Pas besoin de cast car le compilateur a toutes les informations pour effectuer l'opération.
dynamic: utile lors du codage à l'aide de la réflexion ou de la prise en charge d'un langage dynamique ou avec les objets COM, car nous avons besoin d'écrire moins de code.
var: utile pour obtenir le résultat des requêtes linq. Dans le framework 3.5, il présente la prise en charge de la fonction linq.
Référence: Counsellingbyabhi
la source
la source
Ne confondez pas dynamique et var. La déclaration d'une variable locale à l'aide de var n'est qu'un raccourci syntaxique permettant au compilateur de déduire le type de données spécifique d'une expression. Le mot clé var ne peut être utilisé que pour déclarer des variables locales dans une méthode tandis que le mot clé dynamique peut être utilisé pour des variables, des champs et des arguments locaux. Vous ne pouvez pas convertir une expression en var, mais vous pouvez convertir une expression en dynamique. Vous devez initialiser explicitement une variable déclarée à l'aide de var alors que vous n'avez pas à initialiser une variable déclarée avec dynamic.
la source
Exemple:
Mais dans le type dynamique, le type sous-jacent est déterminé uniquement au moment de l'exécution.Le type de données dynamique n'est pas vérifié au moment de la compilation et il n'est pas non plus fortement typé.Nous pouvons attribuer n'importe quelle valeur initiale pour le type dynamique, puis il peut être réaffecté à tout nouveau valeur pendant sa durée de vie.
Exemple:
Il ne fournit pas non plus de support IntelliSense, il ne fournit pas un meilleur support lorsque nous donnons également du travail avec linq, car il ne prend pas en charge les expressions lambda, les méthodes d'extension et les méthodes anonymes.
la source
Voici les différences
var est typé statiquement (au moment de la compilation), dynamic est typé dynamiquement (au moment de l'exécution)
Une variable déclarée comme var ne peut être utilisée que localement, des variables dynamiques peuvent être passées en tant que paramètres pour fonctionner (la signature de fonction peut définir un paramètre comme dynamique mais pas var).
avec dynamic, la résolution des propriétés se produit au moment de l'exécution et ce n'est pas le cas avec var, ce qui signifie qu'au moment de la compilation, toute variable déclarée comme dynamique peut appeler une méthode qui peut ou non exister et donc le compilateur ne générera pas d'erreur.
Le cast de type avec var n'est pas possible mais avec dynamique c'est possible (vous pouvez cast un objet comme dynamique mais pas comme var).
Arun Vijayraghavan
la source