2009-12-17 12 views
50

Possible en double:
What’s the difference between dynamic(C# 4) and var?dynamique vs var

Quelle est la différence entre mot-clé dynamique 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 champs et même des invocations d'objet qui contournent la liaison statique normale de C# et sont résolus dynamiquement.

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.

Comment 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); 
+0

Voir http://stackoverflow.com/questions/961581/whats-the-difference-between-dynamicc-4-and-var –

Répondre

90

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

A a1 = new A(); 

Toute la liaison est toujours fait entièrement statiquement. Si vous regardez le code généré, ce sera exactement la même chose qu'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, de sorte qu'elle peut se comporter dynamiquement. 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'objet implémente IDynamicMetaObjectProvider il peut décider quoi faire avec l'appel au moment de l'exécution, répondant à n'importe quel appel de méthode (ou autre type d'utilisation) - en d'autres termes, il ne doit pas y avoir de "réel" méthode appelée Foo du tout.

Si vous regardez le code généré dans la situation dynamique, vous trouverez toutes sortes de choses bizarres et merveilleuses à faire avec les sites d'appel et les classeurs.

14

Dans le cas var, A() doit avoir une méthode .Foo(int) sur elle lors de la compilation.

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

24

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