2009-12-17 11 views

Respuesta

44

Debe evitar preocuparse por las implicaciones de rendimiento de características de lenguaje específicas a menos que tenga pruebas específicas (medidas) de que realmente están causando un problema.

Sus principales preocupaciones deberían ser la exactitud del código y su capacidad de mantenimiento.

Como observación general, sin embargo, a menudo se puede evitar el fundido innecesario en C# simplemente aplicando buenas prácticas de programación OO y utilizando genéricos (particularmente las colecciones) de manera apropiada. En los casos en los que es necesario realizar un casting, es muy poco probable que sea un cuello de botella de rendimiento, a menos que lo haga en un ciclo cerrado o con tipos que puedan arrojar una excepción de conversión no válida.

La mayoría de los problemas de rendimiento del mundo real surgen de las elecciones de algoritmos o la falta de conocimiento de la plataforma en sí misma, no de características específicas del lenguaje.

+50

Tal vez podrías agregar algo al final sobre __la sobrecarga del tipo casting__. Es bueno tener un consejo, pero no responde la pregunta. –

+0

Una buena respuesta a una pregunta diferente. – Acidic

18

No, no debe evitarse a toda costa. El casting no es muy caro. Por supuesto, si tiene un bucle que se ejecuta un millón de veces por segundo, puede tener sentido evitar el lanzamiento para ahorrar algo de rendimiento, de lo contrario, no causará problemas de rendimiento.

El problema real con la fundición es que es una seguridad de tipo trampa. Si no tienes cuidado, no es demasiado difícil introducir errores o disminuir la legibilidad del código si lanzas cosas por todos lados.

4

Si puede utilizar medicamentos genéricos, entonces es una solución mejor que la de fundición. El boxeo y el desempaquetado es una operación costosa que debe evitarse si es posible. El problema es que a veces simplemente no se puede evitar.

También la otra respuesta aquí mencionada que preocuparse por algo como el boxeo es muy trivial en comparación con las preocupaciones específicas de rendimiento o la mantenibilidad del código. Estoy completamente de acuerdo con eso.

+1

No creo que el boxeo se aplique aquí porque OP está preguntando acerca de lanzar el objeto al objeto, no el valor al objeto. –

2

En general, el costo de emitir un objeto en una base ad hoc es bajo en la gran escala de cosas. Sin embargo, si está lanzando objetos repetidamente muchas veces, entonces es cuando debería tratar de evitarlo si encuentra que es la causa de un problema de rendimiento.

Después de todo, una de las principales mejoras de .NET 1.1 a 2.0 fue la introducción de los genéricos - esta abordó la cuestión de inflexible listas de objetos (por ejemplo ArrayList = basado en objeto, List = Lista mecanografiado)

Cuestiones relacionadas