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
.