Recientemente he estado estudiando más sobre los tipos dinámicos en C #. Con algunos ejemplos que entendí una vez que se compila el código, no es necesario volver a compilarlo, pero se puede ejecutar directamente.
Creo que la flexibilidad que brinda la palabra clave para poder cambiar el tipo de datos a voluntad es una gran ventaja .
Pregunta,
¿Hay alguna deficiencia específica aparte de las llamadas incorrectas a métodos dinámicos que arrojan excepciones de tiempo de ejecución que los desarrolladores deben conocer antes de comenzar la implementación?
c#
.net
visual-studio-2010
Karthik Sreenivasan
fuente
fuente
object
moldes de tipo directo es un olor a código. En casi todos los casos, significaba que yo o uno de mi equipo no había diseñado una interfaz adecuada para esa funcionalidad. Supongo que si estuviera usando C # 4 ahora, me sentiría casi de la misma manera sobre el uso dedynamic
. Podría ver el caso si lo hace todo dinámico, pero en ese caso también podría haber seleccionado un lenguaje de escritura dinámico en primer lugar. * 8 ')dynamic
en C # significa que no tiene que abandonar IronPython si todo lo que necesita es escribir algo dinámico para una pequeña parte de su código. Para un evaluador de expresiones, he tenido un gran éxitodynamic
al representar los operandos de una expresión y los resultados de la evaluación.dynamic
, además desearía haber sabido sobre IronPython cuando estaba desarrollando con .Net, podría haber hecho que ciertas cosas que estábamos tratando de hacer fueran mucho más fáciles.Respuestas:
La principal desventaja es que descarta una de las principales propiedades (no necesariamente ventajas) de C #: que está estáticamente tipado (y para la mayoría de los tipos es seguro).
El problema con la escritura dinámica es que a menudo oculta errores que de otro modo se revelarían durante la compilación. Tal error solo se manifiesta en tiempo de ejecución, lo que por supuesto hace que sea mucho más difícil de detectar.
Hay muy pocas razones de la OMI para usar la escritura dinámica en C #, la principal es la colaboración con lenguajes escritos dinámicamente (que es AFAIK, la razón por la que la dinámica se introdujo en primer lugar).
Si desea hacer una programación totalmente tipada dinámicamente, debe buscar algún lenguaje que esté diseñado para ser dinámico, no piratear C # para que sea dinámico. Puede usar, por ejemplo, IronPython si desea usar bibliotecas .Net
fuente
dynamic
te brinda es la capacidad de lanzar un objeto a su tipo real sin ningún tipo de truco de reflexión. Por ejemplo, siBase foo = new Derived();
hubo dos métodos sobrecargadosMoo(Base x)
yMoo(Derived x)
, luego ,Moo(foo)
llamadasMoo(Base x)
, peroMoo((dynamic)foo)
llamadasMoo(Derived x)
. Esto lleva a una implementación muy elegante del patrón Visitor, por ejemplo: code.logos.com/blog/2010/03/… y es, en general, una técnica muy poderosa.No estoy seguro de qué tipo de deficiencias está buscando, pero si desea conocer las funciones que funcionan con la escritura estática, pero no con ellas
dynamic
, hay algunas:Los métodos de extensiones no funcionan. Este es probablemente el más grande. Si es así
dynamic collection
, no puede usar código comocollection.Distinct()
. Esto se debe a que los métodos de extensión disponibles dependen de los espacios de nombresusing
y el DLR no tiene forma de conocerlos.Como solución, puede invocar el método de como si fuera normal, método estático:
Enumerable.Distinct(collection)
. O puede cambiar el tipo de colección a algo asíIEnumerable<dynamic>
.foreach
requiereIEnumerable
. En C # normal,foreach
se basa en patrones. Es decir, no requiere ninguna interfaz específica, solo unGetEnumerator()
método que devuelve un objeto adecuado. Si se utilizaforeach
endynamic
la implementación deIEnumerable
se requiere. Pero dado que la razón de este comportamiento es que C # 1.0 no tenía genéricos, esta "deficiencia" es prácticamente irrelevante.fuente
El problema con los tipos dinámicos (no las variables declaradas como dinámicas) en .net es que no tienen mucha funcionalidad disponible para los tipos estáticos.
Por lo tanto, no escriba código con tipos dinámicos a menos que sepa lo que está haciendo.
fuente
Dado que
dynamic
es solo un marcadoobject
, recuadra los tipos de valor.Esto puede tener implicaciones de rendimiento, pero dado que de todos modos usaría la escritura estática en el código crítico de rendimiento, probablemente eso no sea un problema en la práctica.
Este boxeo también interfiere con los tipos de valores mutables. Si los modifica con
dynamic
, solo modificará la copia en recuadro. Pero como no debe usar tipos de valores mutables en primer lugar, tampoco es un gran problema.fuente