Question

J'ai récemment assisté à Code Camp 12 et un intervenant a déclaré que le nouveau mot clé dynamic en C # 4.0 ne devrait être utilisé que pour interopérer avec des langages dynamiques. Je pense qu’il a également dit que c’est un peu lent, comparé à une réflexion normale (qui est elle-même un peu lente).

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

Alors, sera-t-il acceptable d’utiliser le mot clé dynamic pour refléter un objet qui ne provient pas de code dynamique?

Était-ce utile?

La solution

Je dirais "non", mais ne commencez pas à l'utiliser de façon insensée. En fait, dynamic est, d'après ce que j'ai évalué, plus rapide que la réflexion de base, car il garde les délégués (plutôt que d'utiliser la réflexion Invoke all le temps). Deux atouts sont en particulier:

  • appeler des méthodes génériques ( MakeGenericMethod etc. est tellement douloureux)
  • opérateurs appelants

Cependant, il existe des moyens de faire ce dont vous avez besoin avec les interfaces, etc. dynamic sur un type non dynamique équivaut en réalité à la saisie de canards. Cela est utile dans un ensemble de scénarios très limité ; le plus souvent: les interfaces seraient préférées. Par ne pas les exclure.

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

Autres conseils

Si vous sentez que vous avez besoin de dactylographie et que vous n'avez pas vraiment besoin de sécurité lors de la compilation, continuez et utilisez dynamique. Je suis certain que de nouvelles utilisations apparaîtront dans le code uniquement C # (par exemple, interroger une source de données dynamique telle que XML à l'aide de ExpandoObject). Je suis tout aussi certain qu'un grand nombre des nouveaux usages seront superflus, de la même manière que l'utilisation de génériques n'est qu'un moyen plus complexe d'exprimer le polymorphisme.

En ce qui concerne les performances, le DLR de .NET 4 tente de rendre le typage dynamique "rapide". Comme toujours, s’il est assez rapide, vous comprendrez quand vous commencerez à profiler votre application.

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

Eh bien, la réponse est que le mot clé dynamique est pour interop, mais pas seulement pour interop langages dynamiques. COM interop n'est qu'un exemple. L'équipe C # a déjà modifié l'interopérabilité COM pour utiliser cette fonctionnalité, ce qui a grandement facilité l'interopérabilité. J'ai récemment constaté que les vues ASP.NET MVC faisaient quelque chose de similaire.

J'ai également posté un exemple illustrant un autre cas d'utilisation du mot clé dynamique: Dynamique dans C # 4.0: Création de wrappers avec DynamicObject . Ce sont exactement les types d’exemples dont Freed parlait: simplifier l’interopérabilité avec les données XML.

Il faudrait que je dise "Non". Jetez un coup d’œil à http://haacked.com/ archive / 2009/08/26 / method-missing-csharp-4.aspx pour un exemple d'utilisation moins attendue.

Le mot clé dynamique visait clairement à rendre le travail avec les langages dynamiques et dynamiques beaucoup plus facile, mais cela ne signifie pas pour autant que nous devrions le limiter à ces domaines. En ce qui concerne les performances: gardez cela à l'esprit, mais ne vous concentrez pas dessus jusqu'à ce que vous rencontriez un problème de performances. (C’est l’un de ces détails de bas niveau qui est peu susceptible d’affecter les choix de conception de haut niveau et susceptible d’affaiblir les performances avant même de commencer.)

Modifier

En outre, tout bon concepteur de langage est conscient du fait que les utilisateurs utiliseront les fonctionnalités de 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’attacher à peu près n'importe quoi dans le processus "dynamique". capacités des mots clés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top