51 votes

dynamique vs var en C#

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

Quelle est la différence entre les mots clés dynamic et var dans .NET 4.0 (VS 2010). Selon MSDN, la définition de dynamic est - La recherche dynamique vous permet d'écrire des appels de méthodes, d'opérateurs et d'indexeurs, 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. .

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 cela est-il différent dans le contexte du code ci-dessous :

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

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

0 votes

92voto

Jon Skeet Points 692016

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

A a1 = new A();

La reliure n'est pas encore terminé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, ce qui lui permet de se comporter de manière dynamique. Le compilateur ne vérifiera pas si le 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 de la suite à donner à l'appel au moment de l'exécution, en répondant à l'appel à l'aide. tous (ou autre type d'utilisation) - en d'autres termes, il n'est pas nécessaire qu'il y ait une "vraie" 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 concernant les sites d'appel et les classeurs.

24voto

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

13voto

Oded Points 271275

Dans le cadre de la var Dans ce cas, A() doit avoir un .Foo(int) lors de la compilation.

Dans le cadre de la dynamic Dans ce cas, ce n'est pas le cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X