Dondequiera que se use la reflexión a la antigua y la legibilidad del código se haya visto afectada. Y, como dices, algunos escenarios de Interop (de vez en cuando trabajo con COM).
Eso es todo. Si se puede evitar el uso de dynamic
, se debe evitar. Recopilación de tiempo de compilación, rendimiento, etc.
Hace unas semanas, recordé this article. Cuando lo leí por primera vez, fui francamente deslumbrado. Pero lo que no me había dado cuenta es que no sabía cómo incluso usar un operador de algún tipo desconocido. Empecé a preguntarme cuál sería el código generado para algo como esto:
dynamic c = 10;
int b = c * c;
Utilizando la reflexión regular, no puede usar los operadores definidos. Se generó bastante código, usando algunas cosas de un espacio de nombre Microsoft
. Digamos que el código anterior es mucho más fácil de leer :) Es bueno que funcione, pero también fue muy lento: aproximadamente 10,000 veces más lento que una multiplicación regular (doh), y aproximadamente 100 veces más lento que una interfaz ICalculator
con un método Multiply.
Editar - código generado, para los interesados:
if (<Test>o__SiteContainer0.<>p__Sitea == null)
<Test>o__SiteContainer0.<>p__Sitea =
CallSite<Func<CallSite, object, object, object>>.Create(
new CSharpBinaryOperationBinder(ExpressionType.Multiply,
false, false, new CSharpArgumentInfo[] {
new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null),
new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null) }));
b = <Test>o__SiteContainer0.<>p__Site9.Target(
<Test>o__SiteContainer0.<>p__Site9,
<Test>o__SiteContainer0.<>p__Sitea.Target(
<Test>o__SiteContainer0.<>p__Sitea, c, c));
¿Pregunta duplicada? Ver http://stackoverflow.com/questions/244302/what-do-you-think-of-the-new-c-4-0-dynamic-keyword – Lazarus
no realmente ... la pregunta no es '¿te gusta? eso ?' pero ¿qué vas a hacer con eso? Pero es cierto, es bastante cercano. Hice una búsqueda sobre una pregunta similar, pero no tropecé con esta. – thinkbeforecoding
Esta es una discusión sin respuesta "correcta". Por lo tanto, debe ser una wiki comunitaria. – ryeguy