En C# existen dos formas principales de definir valores constantes: const y static readonly.
A simple vista parecen similares, pero no son equivalentes. La diferencia entre ambos puede tener implicaciones importantes en rendimiento, versionado y comportamiento en tiempo de ejecución.
Cuando definimos un campo como const, su valor se conoce y se fija en tiempo de compilación.
Esto significa que el compilador reemplaza todas las referencias a esa constante por su valor literal.
public class MathUtils
{
public const double Pi = 3.14159265359;
}
Si en otro proyecto escribimos:
Console.WriteLine(MathUtils.Pi);
El compilador incrusta el valor 3.14159265359 directamente en el código IL.
Por eso, si luego cambiamos Pi a 3.14 y recompilamos solo la librería, las aplicaciones que la usaban seguirán mostrando 3.14159265359, a menos que se recompilen también.
En resumen:
- Resuelto en tiempo de compilación.
- Solo admite tipos primitivos o string.
- Se incrusta literalmente en el código.
- No puede cambiar nunca.
Un campo static readonly se evalúa en tiempo de ejecución, no en compilación.
Su valor puede asignarse en la declaración o dentro del constructor estático de la clase.
public class Config
{
public static readonly DateTime StartTime = DateTime.Now;
}
Aquí StartTime toma el valor actual al cargarse la clase, algo que sería imposible con const.
Otra diferencia clave: si modificamos el valor en el código fuente y recompilamos solo la librería, las aplicaciones que la referencian verán el cambio sin necesidad de recompilarse.
En resumen:
- Evaluado en tiempo de ejecución.
- Admite cualquier tipo (incluso objetos complejos).
- No se incrusta en el código cliente.
- Puede inicializarse en constructores estáticos.
Usá const cuando el valor sea verdaderamente inmutable y universal (como Math.PI, o un nombre de tabla en una base de datos).
Usá static readonly cuando el valor dependa de la ejecución o pueda cambiar sin recompilar los clientes.
