web-dev-qa-db-fra.com

dynamique vs var en C #

Duplicata possible:
Quelle est la différence entre dynamique (C # 4) et var?

Quelle est la différence entre les mots clés dynamiques et var dans .NET 4.0 (VS 2010). Selon MSDN, la définition de dynamique est - La recherche dynamique vous permet d'écrire des appels de méthode, d'opérateur et d'indexeur, des accès aux propriétés et aux champs, et même des invocations d'objets qui contournent la liaison statique normale de C # et sont résolus dynamiquement à la place.

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 détermine le type.

En quoi est-ce différent dans le contexte de code ci-dessous:

var a1 = new A();
a1.Foo(1);

dynamic a2 = new A();
a2.Foo(1);
52
Bhaskar

var signifie que le type statique est inféré - dans votre cas, il est exactement équivalent à

A a1 = new A();

Toute la liaison est toujours effectuée entièrement statiquement. Si vous regardez le code généré, il sera exactement le même qu'avec la déclaration ci-dessus.

dynamic signifie que toute expression utilisant a2 est lié au moment de l'exécution plutôt qu'au moment de la compilation, il peut donc se comporter dynamiquement. Le compilateur ne vérifiera pas si la méthode Foo existe - le comportement est déterminé au moment de l'exécution. En effet, si l'objet implémente IDynamicMetaObjectProvider, il pourrait décider quoi faire de l'appel au moment de l'exécution, en répondant à any appel de méthode (ou autre type d'utilisation) - en d'autres termes, il ne doit pas du tout être une "vraie" méthode appelée Foo.

Si vous regardez le code généré dans la situation dynamique, vous trouverez toutes sortes de choses étranges et merveilleuses concernant les sites d'appels et les classeurs.

93
Jon Skeet

var est de type sécurisé, en ce sens qu'il utilise l'inférence de type. L'écriture de var a = new A(); est un raccourci pour A a = new A();. Une variable déclarée dynamic n'est PAS sécurisée de type et le compilateur ne fait rien pour vérifier que les méthodes que vous appelez existent.

25

Dans le cas var, A() doit avoir une méthode .Foo(int) dessus pendant la compilation.

Dans le cas dynamic, ce n'est pas le cas.

14
Oded