Dado que hay ciertos casos en los
que resulta interesante disponer de la capacidad de sólo lectura que tienen las
constantes pero no es posible usarlas debido a las restricciones que hay
impuestas sobre su uso, en C# también se da la posibilidad de definir variables
que sólo puedan ser leídas. Para ello se usa la siguiente sintaxis:
readonly
<tipoConstante> <nombreConstante> = <valor>;
Estas variables superan la
mayoría de las limitaciones de las constantes. Por ejemplo:
- No es obligatorio darles un valor al definirlas,
sino que puede dárseles en el constructor. Ahora bien, una vez dado un
valor a una variable readonly ya no es
posible volverlo a modificar. Si no se le da ningún valor ni en su
constructor ni en su definición tomará el valor por defecto
correspondiente a su tipo de dato.
- No tienen porqué almacenar valores constantes, sino
que el valor que almacenen puede calcularse durante la ejecución de la
aplicación.
- No tienen porqué definirse como estáticas, aunque
si se desea puede hacerse.
- Su valor se determina durante la ejecución de la
aplicación, lo que permite la actualización de códigos cliente sin
necesidad de recompilar. Por ejemplo, dado:
namespace Programa1
{
public
class Utilidad
{
public
static readonly int X = 1;
}
}
namespace Programa2
{
class
Test
{
public
static void Main() {
System.Console.WriteLine(Programa1.Utilidad.X);
}
}
}
En principio,
la ejecución de este programa producirá el valor 1. Sin embargo, si cada
espacio de nombres se compilan en módulos de código separados que luego se
enlazan dinámicamete y cambiamos el valor de X,
sólo tendremos que recompilar el módulo donde esté definido Programa1.Utilidad y Programa2.Test
podrá ejecutarse usando el nuevo valor de X
sin necesidad de recompilalo.
Sin embargo,
pese a las ventajas que las variables de sólo lectura ofrecen respecto a
las constantes, tienen dos
inconvenientes respecto a éstas: sólo pueden definirse como campos (no como
variables locales) y con ellas no es posible realizar las optimizaciones de
código comentadas para las constantes.