Por alguna razón, siempre he supuesto que los campos readonly
tienen una sobrecarga asociada a ellos, lo cual pensé que era el CLR que hacía un seguimiento de si un campo readonly
se había inicializado o no. La sobrecarga aquí sería algo de uso de memoria adicional para realizar un seguimiento del estado y una verificación al asignar un valor.¿Hay alguna sobrecarga en tiempo de ejecución para leer solo?
Quizás asumí esto porque no sabía que un campo readonly
solo se podía inicializar dentro de un constructor o dentro de la propia declaración de campo y sin una verificación en tiempo de ejecución, no se podría garantizar que no se esté asignando a varias veces en varios métodos. Pero ahora que lo sé, podría ser comprobado de forma estática por el compilador de C#, ¿verdad? Entonces, ¿es ese el caso?
Otra razón es que he leído que el uso de readonly
tiene un "leve" impacto en el rendimiento, pero nunca entraron en este reclamo y no puedo encontrar información sobre este tema, de ahí mi pregunta. No sé qué otro impacto en el rendimiento podría haber, aparte de los controles de tiempo de ejecución.
Una tercera razón es que he visto que readonly
se conserva en la IL compilado como initonly
, así que lo que es la razón de que esta información sea de la IL si readonly
no es nada más que una garantía por el compilador de C# que el campo nunca se asigna a fuera de un constructor o declaración?
Por otro lado, he descubierto que puede establecer el valor de readonly int
a través de la reflexión sin que el CLR arroje una excepción, lo que no debería ser posible si readonly
fuera una verificación en tiempo de ejecución.
Así que mi suposición es: la 'readonlyness' es solo una característica de tiempo de compilación, ¿alguien puede confirmar/negar esto? Y si lo es, ¿cuál es el motivo de que esta información se incluya en la IL?
Vaya, usted encontró el mismo análisis de rendimiento que yo. Así que +1 para ti y he eliminado mi respuesta (menos detallada). – Eddie
Tiene perfecto sentido, gracias :) – JulianR