57 votes

Pourquoi le type dynamique C # est-il statique?

Lors de la lecture et de l’exploration du mot-clé dynamic, j’ai trouvé la ligne suivante sur [MSDN] (dans Utilisation de type dynamique (Guide de programmation C #) ):

Le type est un type statique, mais un objet de type dynamique contourne la vérification de type statique. Dans la plupart des cas, il fonctionne comme s'il avait un objet type.

Quelle est la signification de static dans la ligne ci-dessus et comment ignore-t-il la vérification de type statique?

116voto

Matt Burland Points 18628

C'est le typage statique:

string foo = "bar";

foo est maintenant une chaîne de caractères, de sorte que cela va provoquer une erreur de compilation:

foo = 1;

Même si vous utilisez var, c'est toujours statiquement typé:

var foo = "bar";     // foo is now a string
foo = 1;             // still a compile time error

En utilisant le mot-clé dynamic, signifie que le type ne sera pas statique et peut être modifié, de sorte que vous pouvez désormais le faire:

dynamic foo = "bar";   
foo = 1;              // this is now fine.

Maintenant, pourquoi dit-on "le type est un type statique" est parce que dans de nombreux langages dynamiques (comme Javascript), vous pouvez faire quelque chose comme ceci:

var foo = { bar: 1 };

Ce qui crée un objet avec une propriété appelée "barre", et ensuite vous pouvez faire ceci:

foo.la = 2;

Ce qui ajoute une nouvelle propriété à l'objet en foo. Mais si vous essayez de le même truc en C#

dynamic foo = new SomeClassThatDoesntHaveABarProperty();
foo.bar = 2;          // runtime error

Et vous ne pouvez pas supprimer une propriété. Vous pouvez assigner n'importe quel type d'une variable dynamique, mais vous ne pouvez pas modifier ces types eux-mêmes.

Si vous avez besoin de ce type de fonctionnalités, alors vous aurez envie de regarder ExpandoObject

Comme votre description dit, dynamic des fonctions comme un objet dans beaucoup de cas. Vous pouvez faire ceci:

dynamic foo = new Foo();
foo = new Bar();

Juste comme bien comme ceci:

object foo = new Foo();
foo = new Bar();

Mais la différence vient quand vous voulez utiliser les propriétés ou méthodes. Dynamique, je peux faire ceci:

dynamic foo = new Foo();
foo.FooMethod();          // Note: You WILL get a runtime exception if foo doesn't have a FooMethod

Mais avec un objet, j'avais besoin de le faire:

object foo = new Foo();
((Foo)foo).FooMethod();    // Note: I HAVE to know the type at compile time here

Que je ne peux que faire si je sais déjà que je peux lancer le type en foo à un type d' Foo au moment de la compilation, et si je le savais déjà, alors je pourrais juste avoir utiliser Foo que mon type, au lieu d' object.

1voto

T_D Points 940

Cela signifie qu'une variable déclarée comme dynamique qui va rester de type dynamique et ne peut pas être changé pour une variable de type int par exemple. Ce concept est court-circuité si, parce que vous pouvez changer les types d'objets que la variable contient.

C# est considérée comme un langage fortement typé parce que les variables sont statiquement typé. Cela signifie que chaque variable est typée et le C#-compilateur peut vérifier si les types sont utilisés dans le code. Dans le langage faiblement typé comme la plupart des langages de script le type de variables est dynamique. Ils peuvent contenir n'importe quelle valeur.

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