C # - ¿Tipo dinámico o encasillado?

Hablando de rendimiento, ¿qué es mejor en C #? ¿Usar tipos dinámicos o encasillados?

Así (solo un ejemplo, no la implementación real):

var list = new List<object>();
list.Add(new Woman());
list.Add(new Men());
list.Add(new Car());
....... in another code ....
var men = (Men)list[1];
men.SomeMenMethod();

O esta

var list = new List<dynamic>();
list.Add(new Woman());
list.Add(new Men());
list.Add(new Car());
....... in another code ....
var men = list[1];
men.SomeMenMethod();

preguntado el 28 de agosto de 11 a las 00:08

Perfílelo para averiguarlo. Escribe un código que llame al método en ambos sentidos un millón de veces y luego cronometra el tiempo para ver cuál tarda más. Sin embargo, sospecho dos cosas: 1) probablemente pueda reescribir el código para que sepa qué tipos de objetos hay en la lista, de modo que no necesite los moldes, y 2) que la diferencia de rendimiento sea insignificante. -

2 Respuestas

El ejemplo está ideado, ya que sabes que la lista [1] es una Men. Entonces, en ese caso, cualquiera de los dos es idéntico.

Donde la dinámica se vuelve útil cuando no conoce el tipo exacto, pero sabe que en tiempo de ejecución tendrá una SomeMethod o propiedad.

Por supuesto, si la suposición de tipo es incorrecta, entonces el primero arroja una excepción en el

var men = (Men)list[1]; línea mientras que el último arroja la excepción en men.SomeMenMethod();

Respondido 28 ago 11, 04:08

Si es posible, no use ninguno. Intente utilizar una solución de tipo seguro que no implique la conversión o dynamic.

Si eso no es posible, la conversión es mejor, porque es más claro, más seguro para los tipos (el compilador puede verificar que Men realmente tiene SomeMenMethod), la excepción en caso de error es más clara y no funcionará por accidente (si cree que tiene Men, pero en realidad tienes Woman, que implementa el mismo método, funciona, pero probablemente sea un error).

Preguntaste sobre el rendimiento. Nadie más que usted puede conocer realmente el desempeño de su caso específico. Si realmente le importa el rendimiento, mida siempre en ambos sentidos.

Pero mi expectativa es que dynamic va a ser mucho más lento, porque tiene que usar algo como un mini-compilador en tiempo de ejecución. Intenta almacenar en caché los resultados después de la primera ejecución, pero lo más probable es que no sea más rápido que un lanzamiento.

Respondido 28 ago 11, 18:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.