Dynamic Lang. Tiempo de ejecución vs Reflexión


Estoy planeando usar la palabra clave dinámica para mi nuevo proyecto. Pero antes de intervenir, me gustaría saber sobre los pros y los contras en el uso de palabras clave dinámicas sobre la Reflexión.

Siguiendo donde los pros, pude encontrar con respecto a la palabra clave dinámica:

  • Código legible\mantenible.
  • Menos líneas de código.

Mientras que los negativos asociados con el uso de la palabra clave dinámica, llegué a escuchar era como:

  • Afecta el rendimiento de la aplicación.
  • La palabra clave dinámica es internamente una envoltura de Reflexión.
  • La tipificación dinámica podría convertirse en caldo de cultivo para errores difíciles de encontrar.
  • Afecta a la interoperabilidad con versiones anteriores de.NET.

Por favor, ayúdame a saber si los pros y los contras que encontré son sensatos o no.

Author: abatishchev, 2011-01-10

6 answers

Código legible\mantenible

Ciertamente cierto en mi experiencia.

Menos líneas de código.

No significativamente, pero ayudará.

Afecta el rendimiento de la aplicación.

Muy ligeramente. Pero ni siquiera cerca de la forma en que lo hace la reflexión.

La palabra clave dinámica es internamente una envoltura de Reflexión.

Completamente falso. La palabra clave dinámica aprovecha la Biblioteca Dinámica Ejecución.

[Editar: corrección según el comentario a continuación]

Parece que el Tiempo de ejecución del Lenguaje Dinámico utiliza Reflexión y las mejoras de rendimiento solo se deben a las técnicas de caché.

La tipificación dinámica podría convertirse en caldo de cultivo para errores difíciles de encontrar.

Esto puede ser cierto; depende de cómo escriba su código. Está eliminando efectivamente la comprobación del compilador de su código. Si su cobertura de prueba es buena, esto probablemente no importará; si no, entonces sospecho que tendrá problemas.

Afecta a la interoperabilidad con versiones anteriores de. NET

No es cierto. Quiero decir que no podrás compilar tu código contra versiones anteriores, pero si quieres hacerlo, entonces deberías usar las versiones anteriores como base y compilarlo en lugar de al revés. Pero si desea utilizar una biblioteca.NET 2, entonces no debería tener demasiados problemas, siempre y cuando incluya la declaración en la aplicación.config / web.config.

Un pro importante que te falta es la interoperabilidad mejorada con los componentes COM/ATL.

 24
Author: pdr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-10 16:04:12

Por favor, ayúdame a saber si los pros y los contras que encontré son sensatos o no.

La preocupación que tengo con sus pros y contras es que algunos de ellos no abordan las diferencias entre el uso de la reflexión y el uso de la dinámica. Esa tipificación dinámica crea errores que no se detectan hasta que el tiempo de ejecución es cierto para cualquier sistema de tipeo dinámico. Es tan probable que el código de reflexión tenga un error como el código que usa el tipo dinámico.

En lugar de pensar en ello en términos de pros y contras, piénsalo en términos más neutrales. La pregunta que me haría es " ¿Cuáles son las diferencias entre el uso de la reflexión y el uso del tipo dinámico?"

Primero: con la Reflexión obtienes exactamente lo que pediste. Con dynamic, se obtiene lo que el compilador de C# habría hecho si se le hubiera dado la información de tipo en tiempo de compilación. Esas son potencialmente dos completamente cosas diferentes. Si tiene un MethodInfo para un método en particular, e invoca eso método con un argumento particular, entonces que es el método que se invoca, punto. Si usa "dinámico", entonces le está pidiendo al DLR que averigüe en tiempo de ejecución cuál es la opinión del compilador de C# sobre cuál es el método correcto para llamar. El compilador de C# podría elegir un método diferente al que realmente quería.

Segundo: con la Reflexión puedes (si a tu código se le otorgan niveles de confianza adecuados) hacer una reflexión privada. Puede invocar métodos privados, leer campos privados, y así sucesivamente. Si hacerlo es una buena idea, no lo sé. Ciertamente me parece peligroso y tonto, pero no se cual es su solicitud. Con dynamic, obtiene el comportamiento que obtendría del compilador de C#; los métodos y campos privados no son visibles.

Tercero: con la Reflexión, el código que escribes se parece a un mecanismo . Parece que está cargando una fuente de metadatos, extrayendo algunos tipos, extrayendo algunas informaciones de métodos e invocando métodos en objetos receiver a través del método info. Cada paso del camino parece el funcionamiento de un mecanismo . Con dynamic, cada paso del camino se ve como lógica de negocios. Invoca un método en un receptor de la misma manera que lo haría en cualquier otro código. ¿Qué es importante? En algún código, el mecanismo es en realidad lo más importante. En algunos códigos, la lógica de negocio que implementa el mecanismo es lo más importante. Elija la técnica que enfatiza el nivel correcto de abstracción.

Cuarto: los costos de rendimiento son diferentes. Con Reflection no se obtiene ningún comportamiento en caché, lo que significa que las operaciones son generalmente más lentas, pero no hay costo de memoria para mantener la caché y cada operación es aproximadamente el mismo costo. Con el DLR, la primera operación es muy lenta, ya que hace una gran cantidad de análisis, pero el análisis se almacena en caché y se reutiliza. Eso consume memoria, a cambio de una mayor velocidad en llamadas posteriores en algunos escenarios. Cuál es el equilibrio correcto entre velocidad y uso de memoria para su aplicación, no lo sé.

 95
Author: Eric Lippert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-16 15:14:23

Hay 4 grandes diferencias entre la dinámica y la reflexión. A continuación se muestra una explicación detallada de la misma. Referencia http://www.codeproject.com/Articles/593881/What-is-the-difference-between-Reflection-and-Dyna

Punto 1. Inspeccionar VS Invocar

La reflexión puede hacer dos cosas, una es que puede inspeccionar metadatos y la segunda también tiene la capacidad de invocar métodos en tiempo de ejecución.Mientras que en Dynamic solo podemos invocar métodos. Así que si estoy creando software como visual studio IDE entonces la reflexión es el camino a seguir. Si solo quiero invocación dinámica desde el código de mi c#, dinámica es la mejor opción.

Reflección dinámica

Punto 2. Invocación Privada Vs Pública

No puede invocar métodos privados usando dynamic. En la reflexión es posible invocar métodos privados.

Punto 3. Almacenamiento en caché

Dynamic utiliza la reflexión internamente y también agrega beneficios de almacenamiento en caché. Así que si desea invocar un objeto dinámicamente entonces Dynamic es lo mejor para obtener beneficios de rendimiento.

Punto 4. Clases estáticas

La dinámica es específica de la instancia: No tiene acceso a los miembros estáticos; tiene que usar Reflexión en esos escenarios.

 11
Author: Shivprasad Koirala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-21 23:24:18

En la mayoría de los casos, el uso de la palabra clave dinámica no resultará en un código significativamente más corto. En algunos casos lo hará; eso depende del proveedor y como tal es una distinción importante. Probablemente nunca debería usar la palabra clave dinámica para acceder a objetos CLR simples; el beneficio allí es demasiado pequeño.

La palabra clave dinámica socava las herramientas de refactorización automática y hace que las pruebas unitarias de alta cobertura sean más importantes; después de todo, el compilador no comprueba mucho de nada cuando lo usa. Eso no es un gran problema cuando interoperas con una API muy estable o inherentemente tipeada dinámicamente, pero es particularmente desagradable si usas keyword dynamic para acceder a una biblioteca cuya API podría cambiar en el futuro (como cualquier código que escribas tú mismo).

Use la palabra clave con moderación, donde tenga sentido, y asegúrese de que dicho código tenga amplias pruebas unitarias. No lo use donde no es necesario o donde la inferencia de tipos (por ejemplo, var) puede hacer el igual.

Editar: Mencionas a continuación que estás haciendo esto para plug-ins. El Framework de Extensibilidad Administrada fue diseñado con esto en mente - puede ser una mejor opción que keyword dynamic y reflection.

 4
Author: Eamon Nerbonne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-10 13:57:00

Si está utilizando dynamic específicamente para hacer reflexión, su única preocupación es la compatibilidad con versiones anteriores. De lo contrario, gana sobre la reflexión porque es más legible y más corto. De todos modos, perderás mecanografía fuerte y (algo) rendimiento por el uso mismo de la reflexión.

 2
Author: Stilgar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-10 13:08:32

De la forma en que lo veo, todos sus contras para usar dynamic, excepto la interoperabilidad con versiones anteriores de. NET, también están presentes cuando se usa Reflection:

Afecta el rendimiento de la aplicación

Si bien afecta el rendimiento, también lo hace el uso de Reflexión. Por lo que recuerdo, el DLR usa más o menos la Reflexión la primera vez que accede a un método / propiedad de su objeto dinámico para un tipo dado y almacena en caché el par de destino tipo/acceso para que el acceso posterior sea solo una búsqueda en el cache lo hace más rápido que la Reflexión

La palabra clave dinámica es internamente una envoltura de Reflexión

Incluso si fuera cierto (ver arriba), ¿cómo sería eso un punto negativo? Si envuelve o no la reflexión no debería influir en su aplicación en ningún asunto significativo.

La tipificación dinámica podría convertirse en caldo de cultivo para errores difíciles de encontrar

Si bien esto es cierto, siempre y cuando lo uses con moderación, no debería ser mucho problema. Además es que básicamente lo usa como un reemplazo para la reflexión (es decir, usa dinámica solo para las duraciones más breves posibles cuando desea acceder a algo a través de reflexión), el riesgo de tales errores no debería ser significativamente mayor que si usa reflexión para acceder a sus métodos/propiedades (por supuesto, si hace que todo sea dinámico puede ser más un problema).

Afecta a la interoperabilidad con versiones anteriores de. NET

Para eso tienes que decida usted mismo cuánto de una preocupación es para usted.

 1
Author: Grizzly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-08 11:29:05