2008-11-18 8 views
26

Lorsque C# 4.0 est sorti et nous avons le mot-clé dynamique tel que décrit dans ce excellent presentation by Anders Hejlsberg, (C# évolue plus vite que je peux suivre .. Je n'ai pas eu beaucoup de temps pour me familiariser avec le mot-clé var)Le nouveau mot clé 'dynamique' C# 4.0 déprécie-t-il le mot clé 'var'?

Aurais-je encore besoin du mot-clé var? Y at-il quelque chose que var peut faire ... cette dynamique ne peut pas?

var x = SomeFunctionThatIKnowReturnsSomeKindOfList(); 
// do something with x 

dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList(); 
// do something with x 
+3

Peut-être pas important, mais alors que var est un mot-clé, la dynamique ne l'est pas. C'est un type. – TimothyP

+0

Donc, 'dynamic' ressemble à déclarer quelque chose de type "object" mais le compilateur ne se plaint pas, quand vous appelez des méthodes qui n'existent pas? –

+1

Oui, il sera résolu au moment de l'exécution. S'il existe, la méthode sera appelée .. sinon Boom! – Gishu

Répondre

72

Non, ils sont très différents. Signifie «déduire le type de la variable au moment de la compilation» - mais il est encore entièrement lié statiquement.

dynamic signifie « suppose que je peux faire tout ce que je veux avec cette variable » - à savoir le compilateur ne sait pas ce que les opérations sont disponibles, et le DLR travaillera à ce que les appels vraiment dire au moment de l'exécution.

Je me attends à utiliser dynamic très rarement - seulement quand je veux vraiment un comportement dynamique:

  • var vous permet de rattraper les fautes de frappe, etc à la compilation
  • le code statiquement lié est toujours va courir plus vite que dynamiquement code lié (même si la différence devient raisonnablement faible)
  • Le code lié statiquement fournit plus de support de compilation au-delà des erreurs: vous pouvez trouver des hiérarchies d'appels, le refactoring fonctionnera mieux, Intellisense est disponible, etc.
+0

C'était ma pièce manquante .. var est statique-contraignant (et vient donc avec les avantages des contrôles de compilation, outillage, etc.) – Gishu

+1

vous pouvez essentiellement penser à var comme du sucre syntaxique –

17

Dynamique et var représentent deux idées complètement différentes.

var

Var demande essentiellement au compilateur de déterminer le type de la variable en fonction de l'expression sur le côté droit de l'instruction d'affectation. La variable est ensuite traitée exactement comme si elle était explicitement déclarée comme le type de l'expression. Par exemple, les deux déclarations sont équivalentes

var a = "foo"; 
string a = "foo"; 

La clé à emporter ici est que « var » est 100% de type sécurité et est une opération de compilation

dynamique

dynamique suivants est à bien des égards, le contraire de var. L'utilisation de la dynamique élimine essentiellement tout type de sécurité pour la variable particulière. De nombreuses façons, il n'a aucun type. Lorsque vous appelez une méthode ou un champ sur la variable, la détermination de l'invocation de ce champ se produit au moment de l'exécution. Par exemple

dynamic d = SomeOperation(); 
d.Foo(); // Will this fail or not? Won't know until you run the program 

La clé à emporter ici est que « dynamique » est de type pas en sécurité et est une opération d'exécution

+2

Il est encore le type de sécurité, c'est juste que le type n'est pas connu au moment de la compilation. Si l'objet réel (d'exécution) n'a pas de membre particulier auquel vous essayez d'accéder, vous aurez une exception. –

+0

Comparez: vous pouvez utiliser var dans les projets .NET 2.0. Pas dynamique. –

1

Oui, vous aurez toujours besoin var:

Var est un variable dont le type sera déduit par le compilateur.
dynamique aura son type affecté à l'exécution

Alors:

Var i = "Hello World" 

aura son type inféré comme un type de chaîne en faisant intellisence vous donnera toutes les méthodes que la chaîne peut utiliser comme ,

i.Split("/") 

Où que:

dynamic i = "Hello World" 

aura pas son type inféré d'exécution jusqu'à ce que le complier dosn't savoir quel type il est encore, mais encore vous laisser faire:

i.Split("/") 

mais quand il appelle la méthode que vous en avez besoin peut échouer parce que le type est faux et la méthode n'est pas là.

+0

Pedant: "var" est une * variable * dont le type sera déduit par le compilateur. L'objet n'est pas affecté. "dynamic" est une variable qui est statiquement typée "dynamic" - c'est le mécanisme de dispatch qui change (la variable est toujours typée "dynamic"). –