J'ai récemment étudié davantage les types dynamiques en C #. Avec quelques exemples que j'ai compris une fois que le code est compilé, il n'a pas besoin d'être recompilé à nouveau mais peut être exécuté directement.
Je pense que la flexibilité offerte par le mot-clé pour pouvoir réellement changer le type de données à volonté est un grand avantage .
Question,
Existe-t-il des lacunes spécifiques en dehors des mauvais appels de méthode dynamique qui génèrent des exceptions d'exécution que les développeurs doivent connaître avant de démarrer l'implémentation.
c#
.net
visual-studio-2010
Karthik Sreenivasan
la source
la source
object
ou la conversion de type direct comme une odeur de code. Dans presque tous les cas, cela signifiait que moi ou un membre de mon équipe n'avions pas conçu d'interface appropriée pour cette fonctionnalité. Je suppose que si j'utilisais C # 4 maintenant, je ressentirais à peu près la même chose à propos de l'utilisation dedynamic
trop. Je pourrais voir le cas si vous rendiez tout dynamique, mais dans ce cas, vous pourriez aussi bien avoir sélectionné une langue typée dynamique en premier lieu. * 8 ')dynamic
en C # signifie que vous n'avez pas à abandonner vers IronPython si tout ce dont vous avez besoin est un typage dynamique pour une petite partie de votre code. Pour un évaluateur d'expression, j'ai eu beaucoup de succès en utilisantdynamic
pour représenter les opérandes d'une expression et les résultats de l'évaluation.dynamic
, et j'aurais aimé connaître IronPython lorsque je développais avec .Net - cela aurait pu rendre certaines choses que nous essayions de faire beaucoup plus facilement.Réponses:
Le principal inconvénient est que vous jetez l'une des principales propriétés (pas nécessairement des avantages) de C # - qu'il est typé statiquement (et pour la plupart des types sûrs).
Le problème avec le typage dynamique est qu'il cache souvent des bogues qui seraient autrement révélés lors de la compilation. Un tel bogue ne se manifeste alors qu'au moment de l'exécution, ce qui le rend bien sûr beaucoup plus difficile à détecter.
Il y a très peu de raisons à l'OMI d'utiliser le typage dynamique en C #, la principale étant la collaboration avec des langages typés dynamiquement (qui est AFAIK la raison pour laquelle la dynamique a été introduite en premier lieu).
Si vous voulez faire de la programmation entièrement typée dynamiquement, vous devriez regarder un langage qui est conçu pour être dynamique, pas pirater C # pour être dynamique. Vous pouvez utiliser par exemple IronPython si vous souhaitez utiliser des bibliothèques .Net
la source
dynamic
vous donne est la possibilité de monter un objet à son type réel sans aucune sorte de piratage de réflexion. Par exemple, siBase foo = new Derived();
et il y avait deux méthodes surchargéesMoo(Base x)
etMoo(Derived x)
, alors lesMoo(foo)
appelsMoo(Base x)
, mais lesMoo((dynamic)foo)
appelsMoo(Derived x)
. Cela conduit à une implémentation très élégante du modèle Visitor par exemple: code.logos.com/blog/2010/03/… et est en général une technique très puissante.Je ne sais pas quel type de lacunes recherchez-vous, mais si vous voulez en savoir plus sur les fonctionnalités qui fonctionnent avec la frappe statique, mais pas avec
dynamic
, il y en a peu:Les méthodes d'extensions ne fonctionnent pas. C'est probablement le plus gros. Si c'est le cas
dynamic collection
, vous ne pouvez pas utiliser de code commecollection.Distinct()
. En effet, les méthodes d'extension disponibles dépendent des espaces de nomsusing
et le DLR n'a aucun moyen de les connaître.Pour contourner ce problème, vous pouvez invoquer la méthode comme si elle était méthode statique normale:
Enumerable.Distinct(collection)
. Ou vous pouvez changer le type de la collection en quelque chose commeIEnumerable<dynamic>
.foreach
requiertIEnumerable
. En C # normal,foreach
est basé sur un modèle. Autrement dit, il ne nécessite aucune interface spécifique, juste uneGetEnumerator()
méthode qui renvoie un objet approprié. Si vous utilisezforeach
dessusdynamic
, l'implémentation deIEnumerable
est requise. Mais puisque la raison de ce comportement est que C # 1.0 n'avait pas de génériques, ce "défaut" est à peu près hors de propos.la source
Le problème avec les types dynamiques (pas les variables déclarées comme dynamiques) dans .net est qu'ils n'ont pas beaucoup de fonctionnalités disponibles pour les types statiques.
N'écrivez donc pas de code avec des types dynamiques à moins de savoir ce que vous faites.
la source
Étant donné qu'il ne
dynamic
s'agit que d'un type,object
il indique les types de valeur.Cela peut avoir des implications sur les performances, mais étant donné que j'utiliserais de toute façon du typage statique dans du code critique pour les performances, ce n'est probablement pas un problème dans la pratique.
Cette boxe interfère également avec les types de valeurs mutables. Si vous les modifiez avec
dynamic
, vous ne modifiez que la copie encadrée. Mais comme vous ne devez pas utiliser de types de valeurs mutables en premier lieu, ce n'est pas un gros problème non plus.la source