Anonyme de Type vs Type Dynamique
Quelles sont les réelles différences entre type anonyme(var) en c# 3.0 et de type dynamique(dynamic) qui est à venir dans le c# 4.0?
- Type anonyme n'est PAS la même chose que la var. Le mot-clé var peut être rappelé à tout moment, et au moment de la compilation sera modifiée pour un type réel de référence. Le mot-clé var est sucre syntaxique, les types anonymes sont des types qui sont générés à votre. Pas les mêmes, mais ils sont utilisés ensemble.
- veuillez consulter stackoverflow.com/questions/17991907/... pour l'anonyme de Type
Vous devez vous connecter pour publier un commentaire.
Un type anonyme est un réel, généré par le compilateur le type qui est créé pour vous. La bonne chose à ce sujet est que le compilateur peut ré-utiliser ce type plus tard pour d'autres opérations qui exigent que c'est un POCO.
Ma compréhension de la dynamique des types, c'est qu'ils sont en retard lié, ce qui signifie que le CLR (ou DLR) évaluera l'objet au moment de l'exécution, puis utiliser le duck-typing pour autoriser ou interdire l'accès des membres à l'objet.
Donc je suppose que la différence est que les types anonymes sont de véritables POCOs que le compilateur peut voir, mais vous ne pouvez les utiliser et les types de dynamiques sont en retard lié à des objets dynamiques.
Vous semblent être un mélange de trois complètement différent, orthogonale choses:
Ces trois aspects sont totalement indépendants, ils n'ont rien à voir les uns avec les autres.
Statique vs dynamique de frappe se réfère à quand la vérification du type de lieu: typage dynamique a lieu à runtime, le typage statique prend place avant l'exécution.
Manifeste vs implicite tapant agit de savoir si les types sont manifeste dans le code source ou pas: manifeste de frappe signifie que le programmeur doit écrire les types dans le code source, de typage implicite signifie que le type de système chiffres sur son propre.
Nommés ou anonymes types se réfère, bien, si les types ont des noms ou non.
La
dynamic
de mots clés de C# 4.0 signifie que cette variable, paramètre, une méthode, un champ, une propriété ... tout ce qui est typées dynamiquement, c'est à dire que son type sera vérifié au moment de l'exécution. Tout ce qui n'est pas typé en tant que dynamique est statiquement typé. Si un type est statique ou dynamique détermine non seulement lors de la vérification de type, mais en C# 4.0, il détermine également, lorsque méthode de répartition prend place. En C#, la méthode d'expédition est effectuée avant l'exécution, basé sur le type statique (à l'exception de l'exécution du sous-type de polymorphisme bien sûr), alors que sur typées dynamiquement des objets en C# 4.0, la méthode de répartition est effectuée au moment de l'exécution, basé sur le moteur d'exécution de type.La
var
de mots clés de C# 3.0 signifie que cette variable locale sera implicitement tapé, c'est à dire qu'au lieu de le programmeur écrit le type de manière explicite, le type de système figure sur son propre. Cela n'a rien à voir avec typage dynamique, au moins en C# 3.0. La variable sera fortement typé statiquement, comme si vous aviez écrit sur le type de vous-même. C'est simplement une commodité: par exemple, pourquoi auriez-vous de les écrire tous les noms de type de deux fois dansHashMap<int, string> foo = new HashMap<int, string>();
lorsque le type de système peut clairement comprendre quefoo
est unHashMap<int, string>
, donc au lieu de vous écrirevar foo = new HashMap<int, string();
. Veuillez noter qu'il n'y a rien de dynamique, d'anonymes ou de sur ce. Le type est statique et il a un nom:HashMap<int, string>
. Bien sûr, en C# 4.0, si le type de système de chiffres que la partie droite de l'affectation est dynamique, alors le type de la variable sur le côté gauche sera dynamique.Un anonyme de type en C# 3.0 signifie que ce type n'a pas de nom. Eh bien, en fait, réel les types anonymes, il aurait fallu en arrière-incompatible changement au Système de Type Commun, de sorte que fait qui se passe derrière le rideau, c'est que le compilateur va générer une très longue, très aléatoire, unique et illégale nom pour le type et le mettre ce nom dans la mesure de l'anonyme de type apparaît. Mais à partir du programmeur point de vue, le type n'a pas de nom. Pourquoi est-ce utile? Eh bien, parfois, vous avez des résultats intermédiaires que vous avez besoin seulement brièvement, puis jeter à nouveau. Donnant comme transitoire types un nom de leurs propres serait l'élever à un niveau d'importance qu'ils ne méritent pas. Mais encore une fois, il n'y a rien de dynamique à ce sujet.
Donc, si le type n'a pas de nom, comment le programmeur reportez-vous à elle? Eh bien, elle ne peut pas! Au moins, pas directement. Ce que le programmeur peut faire, c'est de décrire le type: il dispose de deux propriétés, l'une appelée "nom" de type
string
, l'autre appelé "id" de typeint
. C'est le type que je veux, mais je n'aime pas ce qu'elle est appelée.C'est là que les morceaux commencent à se rassembler. En C#, vous devez déclarer les types de variables locales en écrivant explicitement les noms des types. Mais, comment pouvez-vous écrire le nom d'un type qui n'a pas de nom? C'est là que
var
vient: parce que depuis C# 3.0, ce qui est fait n'est plus vrai: vous n'avez plus à écrire le nom, vous pouvez également indiquer au compilateur pour le comprendre. Donc, tout 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 avec d'autres, il est vrai aussi que les types anonymes serait assez inutile en l'absence de typage implicite.Noter, cependant, que l'inverse n'est pas vrai: typage implicite est parfaitement utilisable sans les types anonymes.
var foo = HashMap<int, string>
sens parfait et il n'y a pas de type anonyme en vue.La
dynamic
type est essentiellementobject
, mais permet de résoudre tous les méthode /propriété /opérateur etc appels au moment de l'exécution par le DLR ou d'autres fournisseurs (tels que la réflexion).Cela le rend beaucoup comme VB avec
Option Strict Off
, et la rend très polyvalente pour la remettre en COM, ou en DLR types.Il est pas type de vérification au moment de la compilation dynamique; convesely, les types anonymes sont appropriés statique de type de, type-vérifié bêtes (vous pouvez les voir dans le réflecteur, bien qu'ils ne sont pas assez).
En outre, les types anonymes peuvent être traitées exclusivement par le compilateur;
dynamic
exige de vastes support d'exécution - de sorte que les types anonymes sont une C#, maisdynamic
sera largement mis en œuvre par l' .NET 4.0 (avec C# 4.0 support).Découvrez Ander de présentation ici:
http://channel9.msdn.com/pdc2008/TL16/
HTM
Il y a trois fois, avec trois acteurs - un à chaque fois.
Les types anonymes sont déclarées et nommé par le compilateur. Cette déclaration est basée sur le programmeur de la spécification (comment il a utilisé le type). Étant donné que ces types sont nommés d'après le programmeur a gauche le processus, ils semblent être des inconnus pour le programmeur, par conséquent, les "anonymes".
typage dynamique en c# vous permet d'appeler des méthodes qui peuvent ou peuvent ne pas exister au moment de la compilation. C'est utile pour appeler en python ou javascript, qui ne sont pas compilés.
Rien de tel qu'un peu de code pour éclaircir les choses: