Quelles sont les différences réelles entre le type anonyme (var) en C# 3.0 et le type dynamique (dynamic) qui arrive en C# 4.0 ?
Réponses
Trop de publicités?Vous semblez mélanger trois choses complètement différentes et orthogonales :
- statique ou dynamique en tapant
- manifeste ou implicite en tapant
- nommé ou anonyme types
Ces trois aspects sont complètement indépendants, ils n'ont absolument rien à voir les uns avec les autres.
Statique ou dynamique ? La typographie fait référence à quand le contrôle de type a lieu : le typage dynamique a lieu à l'endroit suivant temps de fonctionnement le typage statique a lieu avant l'exécution .
Manifeste et implicite Le typage fait référence au fait que les types sont manifeste dans le code source ou non : la saisie manifeste signifie que le programmeur doit écrire les types dans le code source, le typage implicite signifie que les système de type se débrouille tout seul.
Nommé ou anonyme types fait référence au fait que les types ont des noms ou non.
Le site dynamic
en C# 4.0, signifie que cette variable, ce paramètre, cette méthode, ce champ, cette propriété, etc. typée dynamiquement c'est-à-dire que son type sera vérifié au moment de l'exécution. Tout ce qui n'est pas typé comme dynamique est typé statiquement. Le fait qu'un type soit statique ou dynamique ne détermine pas seulement le moment où la vérification du type a lieu, mais en C# 4.0, il détermine également, lorsque la vérification du type a lieu, le moment où la vérification du type a lieu. envoi de méthodes a lieu. En C#, la répartition des méthodes est effectuée avant l'exécution, sur la base du type statique (à l'exception du polymorphisme de sous-type d'exécution, bien sûr), alors que sur les objets typés dynamiquement en C# 4.0, la répartition des méthodes est effectuée à l'exécution, sur la base du type d'exécution.
Le site var
en C# 3.0 signifie que cette variable locale sera implicitement typée En d'autres termes, au lieu que le programmeur écrive explicitement le type, le système de types le déterminera de lui-même. Cela n'a rien à voir avec le typage dynamique, du moins en C# 3.0. La variable sera typée de manière fortement statique, comme si vous aviez écrit le type vous-même. Il s'agit simplement d'une commodité : par exemple, pourquoi devriez-vous écrire tous les noms de type deux fois sur HashMap<int, string> foo = new HashMap<int, string>();
lorsque le système de type peut clairement comprendre que foo
est un HashMap<int, string>
donc, à la place, vous écrivez var foo = new HashMap<int, string();
. Veuillez noter qu'il n'y a rien de dynamique ou d'anonyme dans tout cela. Le type est statique et il a un nom : HashMap<int, string>
. Bien sûr, en C# 4.0, si le système de types comprend que le côté droit de l'affectation est dynamique, alors le type de la variable du côté gauche sera dynamique.
Un site type anonyme en C# 3.0 signifie que ce type n'a pas de nom. En fait, c'est le cas, réel Les types anonymes auraient nécessité une modification rétrocompatible du système de type commun, alors que en fait se passe derrière le rideau, c'est que le compilateur va générer un nom très long, très aléatoire, unique et illégal pour le type et mettre ce nom partout où le type anonyme apparaît. Mais du point de vue du programmeur, le type n'a pas de nom. Pourquoi cela est-il utile ? Eh bien, vous avez parfois des résultats intermédiaires dont vous n'avez besoin que brièvement, puis que vous jetez à nouveau. Donner à ces types transitoires un nom qui leur est propre les élèverait à un niveau d'importance qu'ils ne méritent tout simplement pas. Mais encore une fois, il n'y a rien de dynamique dans tout cela.
Donc, si le type n'a pas de nom, comment le programmeur peut-il s'y référer ? Eh bien, il ne le peut pas ! Du moins pas directement. Ce que le programmeur peut est de décrire le type : il a deux propriétés, une appelée "nom" de type string
l'autre appelé "id" de type int
. C'est le type que je veux, mais je me fiche de son nom.
C'est ici que les pièces commencent à s'assembler. En C#, vous devez déclarer les types des variables locales en écrivant explicitement les noms des types. Mais comment écrire le nom d'un type qui n'en a pas ? C'est ici que le var
car depuis C# 3.0, ce n'est plus vrai : vous n'avez plus besoin d'écrire les noms, vous pouvez aussi demander au compilateur de le faire. Donc, si ce que j'ai écrit dans le premier paragraphe ci-dessus est vrai, que le typage implicite et les types anonymes n'ont rien à voir l'un avec l'autre, il est également vrai que les types anonymes seraient plutôt inutiles sans typage implicite.
Notez toutefois que l'inverse n'est pas vrai : le typage implicite est parfaitement utile sans types anonymes. var foo = HashMap<int, string>
est parfaitement logique et il n'y a pas de type anonyme en vue.
Un type anonyme est un type réel, généré par le compilateur, qui est créé pour vous. Ce qui est bien, c'est que le compilateur peut réutiliser ce type plus tard pour d'autres opérations qui le nécessitent, car il s'agit d'un POCO.
D'après ce que j'ai compris, les types dynamiques sont liés tardivement, ce qui signifie que le CLR (ou DLR) évalue l'objet au moment de l'exécution, puis utilise le typage en canard pour autoriser ou interdire l'accès des membres à l'objet.
Je suppose donc que la différence est que les types anonymes sont de véritables POCO que le compilateur peut voir mais que vous ne pouvez qu'utiliser et que les types dynamiques sont des objets dynamiques liés tardivement.
Le site dynamic
est essentiellement object
mais résoudra tous les appels de méthodes, de propriétés, d'opérateurs, etc. au moment de l'exécution via le DLR ou un autre fournisseur (tel que la réflexion).
Cela ressemble beaucoup à VB avec Option Strict Off
et le rend très polyvalent pour les appels dans COM ou dans les types DLR.
Il y a pas de la vérification des types au moment de la compilation avec la dynamique ; en revanche, les types anonymes sont des bêtes à typage statique et à vérification des types (vous pouvez les voir dans reflector, bien qu'ils ne soient pas beaux).
En outre, les types anonymes peuvent être gérés exclusivement par le compilateur ; dynamic
nécessite un support d'exécution étendu - ainsi, les types anonymes sont une caractéristique de C#, mais dynamic
sera en grande partie mis en œuvre par .NET 4.0 (avec un certain support de C# 4.0).
Il y a trois temps, avec trois acteurs - un dans chaque temps.
- Design-time - programmeur
- Compile-time - compilateur c#
- Runtime - runtime .net
Les types anonymes sont déclarés et nommés par le compilateur. Cette déclaration est basée sur la spécification du programmeur (comment il a utilisé le type). Comme ces types sont nommés après que le programmeur a quitté le processus, ils semblent être sans nom pour le programmeur, d'où le terme "anonyme".
- Le programmeur dit : Un certain type a un nom et une adresse
- Le compilateur dit : Il y a un type nommé xyz avec des propriétés et des champs Nom et Adresse, tous deux des chaînes de caractères.
- le runtime dit : Je ne peux pas faire de différence entre xyz et n'importe quel type créé par le programmeur.
le typage dynamique en c# vous permet d'appeler des méthodes qui peuvent ou non exister au moment de la compilation. Ceci est utile pour appeler dans python ou javascript, qui ne sont pas compilés.
- Le programmeur dit : traitez cette instance d'une voiture comme un type dynamique. Maintenant, quack.
- Le compilateur dit : typage dynamique hein ? ça doit être bon. Je ne me plaindrai pas car je ne peux pas le vérifier.
- Le runtime tente de rendre l'instance de voiture, couac.