Translate

miércoles, 29 de octubre de 2025

Diferencias entre const y static readonly en C#


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.