4 votes

Le mot-clé dynamic est-il censé être utilisé *uniquement* avec les langages dynamiques ?

J'ai assisté au Code Camp 12 récemment, et un conférencier a dit que la nouvelle dynamic mot-clé en C# 4.0 devrait ne doit être utilisé que pour l'interopérabilité avec les langages dynamiques. Je pense qu'il a aussi dit que c'était un peu lent, comparé à la réflexion normale (qui est elle-même un peu lente).

Mais j'ai ensuite entendu Scott Hanselman mentionner que le mot-clé dynamique "rend la réflexion moins pénible".

Est-ce qu'il sera acceptable d'utiliser le mot clé dynamic pour refléter un objet qui ne provient pas d'un code dynamique ?

7voto

Marc Gravell Points 482669

Je dirais "non", mais ne commencez pas à l'utiliser de manière insensée. En fait, dynamic est, d'après ce que j'ai évalué, plus rapide que la réflexion de base, puisqu'elle garde les délégués (plutôt que d'utiliser la réflexion Invoke tout le temps). En particulier, deux points forts :

  • l'appel à des méthodes génériques ( MakeGenericMethod etc. est juste si douloureux)
  • appel des opérateurs

Cependant, il existe des moyens de faire ce dont vous avez besoin avec des interfaces, etc ; dynamic sur un type non-dynamique revient en fait à un typage en canard. Ceci est utile dans un très limité ensemble de scénarios ; principalement : les interfaces seraient préférables. Sans pour autant les exclure.

L'inconvénient de dynamic est que pour être utile (sans écrire un code insensé), vous devez connaître les noms au moment de la compilation, ce qui n'est souvent pas le cas, sinon nous ne serions pas dans ce pétrin ! Lorsque vous ne connaissez le nom qu'au moment de l'exécution, il existe d'autres options ( Expression , Delegate.CreateDelegate , "HyperDescriptor", DynamicMethod etc.) d'accéder aux données de manière rapide.

4voto

SoftMemes Points 2401

Si vous avez l'impression que vous avez besoin d'un typage en canard et que vous n'avez pas vraiment besoin d'une sécurité de type au moment de la compilation, allez-y et utilisez la dynamique. Je suis sûr qu'un certain nombre de nouveaux usages apparaîtront dans du code C# uniquement (comme l'interrogation d'une source de données dynamique telle que XML à l'aide d'ExpandoObject). Je suis tout aussi sûr qu'un grand nombre de ces nouveaux usages seront superflus, de la même manière que l'utilisation des génériques n'est qu'une façon plus complexe d'exprimer le polymorphisme.

En ce qui concerne les performances, le DLR de .NET 4 tente de rendre la saisie dynamique "rapide". Comme toujours, vous découvrirez si elle est suffisamment rapide lorsque vous commencerez à profiler votre application.

2voto

Thomas Levesque Points 141081

D'après ce que je sais, la principale raison pour laquelle les dynamic a été introduit en C# pour faciliter l'interopérabilité avec les objets COM. Mais bien sûr, il peut être utilisé pour la réflexion...

2voto

Alexandra Rusina Points 6063

Eh bien, la réponse est que le mot clé dynamic est destiné à l'interopérabilité, mais pas seulement à l'interopérabilité des langages dynamiques. L'interopérabilité de COM n'est qu'un exemple. L'équipe de C# a déjà modifié l'interopérabilité de COM pour utiliser cette fonctionnalité et cela a rendu l'interopérabilité beaucoup plus facile. J'ai vu récemment que ASP.NET MVC Views faisait quelque chose de similaire.

J'ai également publié un exemple qui montre un autre cas d'utilisation du mot-clé dynamique : Dynamique en C# 4.0 : Création de wrappers avec DynamicObject . C'est exactement le type d'exemples dont parlait M. Freed : simplifier l'interopérabilité avec les données XML.

1voto

John Fisher Points 13621

Je dois dire, "Non". Jetez un coup d'oeil à http://haacked.com/archive/2009/08/26/method-missing-csharp-4.aspx pour un exemple d'une utilisation moins attendue.

Le mot-clé dynamic était clairement destiné à faciliter l'utilisation de COM et des langages dynamiques, mais cela ne signifie pas que nous devions le limiter à ces domaines. En ce qui concerne les performances, gardez-les à l'esprit, mais ne vous y intéressez pas tant que vous n'avez pas de problème de performances. (C'est l'un de ces détails de bas niveau qui a peu de chances d'affecter les choix de conception de haut niveau qui peuvent paralyser les performances avant même que vous ne commenciez).

Modifier

En outre, tout bon concepteur de langage est conscient du fait que les gens utiliseront les caractéristiques du langage de manière inattendue. Ceci est particulièrement pertinent pour cette discussion, car ils ont créé une interface qui permet le comportement dynamique. Ils ont délibérément permis aux gens d'accrocher à peu près n'importe quoi aux capacités des mots-clés "dynamiques".

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