Un constructor estático se ejecuta la primera vez que accede a un miembro estático. Sabiendo esto, tengo varias preguntas:¿Puede un constructor estático reducir el rendimiento del acceso a métodos estáticos?
- ¿Esto significa que cada vez que accedo a un método estático, el tiempo de ejecución debe verificar si se ha llamado al constructor estático?
- ¿Esto genera un golpe de rendimiento?
- ¿Las clases estáticas "sin constructor" evitan este golpe de rendimiento?
[EDIT]: Me gustaría aclarar que no estoy preocupado con micro-optimización.
Estoy haciendo esta pregunta porque es una decisión de diseño . Si un constructor estático incurre en un impacto en el rendimiento, entonces diseñaré mi código teniendo esto en cuenta y estaré más al tanto de las decisiones que pueden afectar el rendimiento.
Aquí hay un ejemplo para ilustrar mi pregunta. ¿Habría algún beneficio de tomar el método Independent
y ponerlo en una clase estática separada? De esta forma, no tendría que verificar si se había inicializado el Test
estático. [Actualización Consulte mi respuesta a continuación para obtener un ejemplo mejor y más simple].
static class Test {
// Static constructor with dependent method:
static int x;
static Test() { x = 5; }
static int Dependent() { return x; }
// Static, independent method:
static int Independent(int y) { return y+1; }
}
Here's the quote de la C# especificación sobre el constructor estático:
La ejecución de un constructor estático se desencadena por la primera de las siguientes eventos a ocurrir dentro de un dominio de aplicación:
- Se crea una instancia de la clase.
- Se hace referencia a cualquiera de los miembros estáticos de la clase.
Posible duplicado: http://stackoverflow.com/questions/2921828/static-constructors-cause-a-performance-over-head –
He leído esa publicación, pero definitivamente difiere de mi pregunta. Compara el rendimiento de ** type-initialization ** vs ** static constructor **. Me interesa saber si un constructor estático ralentiza el acceso a un método. ¡Releí el "duplicado", incluidas todas las respuestas Y enlaces, y todavía no tengo una respuesta a mi pregunta! –
Creo que está en el campo de acceso y no en la llamada al método. Pero sí, puede haber una reducción notable del rendimiento en algunos escenarios. – CodesInChaos