Duplication possible:
Quelle est la différence entre dynamic (C # 4) et var?
Quelle est la différence entre le mot clé dynamic et le mot clé var dans .NET 4.0 (VS 2010). Selon MSDN, la définition dynamic est la suivante: – La recherche dynamic vous permet d’écrire des appels de méthode, d’opérateur et d’indexeur, des access aux propriétés et aux champs et même des invocations d’objects qui contournent la liaison statique normale de C # .
Alors que la définition de var est – Une variable locale implicitement typée est fortement typée comme si vous aviez déclaré le type vous-même, mais le compilateur en détermine le type .
En quoi est-ce différent dans le contexte du code ci-dessous:
var a1 = new A(); a1.Foo(1); dynamic a2 = new A(); a2.Foo(1);
var
signifie que le type statique est inféré – dans votre cas, il est exactement équivalent à
A a1 = new A();
Toute la reliure se fait encore de manière statique. Si vous regardez le code généré, ce sera exactement comme avec la déclaration ci-dessus.
dynamic
signifie que toute expression utilisant a2
est liée au moment de l’exécution plutôt qu’à la compilation, elle peut donc se comporter de manière dynamic. Le compilateur ne vérifie pas si la méthode Foo
existe – le comportement est déterminé au moment de l’exécution. En effet, si l’object implémente IDynamicMetaObjectProvider
il pourrait décider quoi faire de l’appel au moment de l’exécution, en répondant à n’importe quel appel de méthode (ou autre type d’utilisation). Foo
du tout.
Si vous regardez le code généré dans la situation dynamic, vous trouverez toutes sortes de choses étranges et merveilleuses en relation avec les sites d’appel et les classeurs.
var
est de type sécurisé, en ce sens qu’il utilise l’inférence de type. Écrire var a = new A();
est un raccourci pour A a = new A();
. Une variable qui est déclarée dynamic
n’est PAS de type sécurisé et le compilateur ne fait rien pour vérifier que les méthodes auxquelles vous faites appel existent.
Dans le cas var
, A () doit avoir une .Foo(int)
lors de la compilation.
Dans le cas dynamic
, ce n’est pas le cas.