Const vs Readonly en C#: ¿qué elegir y cuál es la diferencia?

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Const vs Readonly en C#: ¿cuál es la diferencia y cuándo usar cada uno?

\n\n

Cada desarrollador de C# tarde o temprano se enfrenta al dilema: ¿declarar un valor como const o como readonly? A primera vista, ambas palabras clave hacen lo mismo: impiden modificar una variable después de la inicialización. Pero si profundizas, descubrirás un abismo de diferencias que afectan la arquitectura, el rendimiento e incluso la seguridad del código.

\n\n

En este artículo no solo enumeraremos datos secos de la documentación. Analizaremos escenarios reales, mostraremos trampas y te ayudaremos a tomar una decisión informada. ¡Allá vamos!

\n\n

¿Qué es const en C#?

\n\n

Const es una constante de tiempo de compilación. Su valor debe conocerse en el momento de la compilación y no puede cambiar en tiempo de ejecución.

\n\n
    \n
  • Solo puede ser de tipos primitivos: int, double, string, bool, enum y null.
  • \n
  • Es implícitamente static — pertenece al tipo, no a la instancia.
  • \n
  • El valor se inserta directamente en el código en la etapa de compilación (como una macro en C++).
  • \n
  • No se puede usar con new ni con tipos de referencia (excepto string).
  • \n
\n\n
public class MathConstants\n{\n    public const double Pi = 3.14159;\n    public const int MaxRetries = 5;\n    public const string AppName = "MyApp";\n    \n    // ¡Error! Los tipos de referencia (excepto string) no se pueden\n    // public const List<int> Numbers = new List<int>();\n}
\n\n

Cuando el compilador encuentra const, literalmente incrusta el valor en el código IL. Esto significa que si usas una constante de otro ensamblado y luego cambias su valor, los ensamblados antiguos seguirán usando el valor anterior hasta que se recompilen.

\n\n

¿Qué es readonly en C#?

\n\n

Readonly es un campo que solo se puede inicializar en el momento de la declaración o en el constructor de la clase. Después de eso, no se puede modificar.

\n\n
    \n
  • Puede ser de cualquier tipo: tanto de valor como de referencia.
  • \n
  • Puede ser estático o de instancia.
  • \n
  • El valor se calcula en tiempo de ejecución (por ejemplo, se puede usar new o una llamada a un método).
  • \n
  • No se inserta en el código — es un campo normal con protección contra escritura.
  • \n
\n\n
public class Config\n{\n    public readonly DateTime CreatedAt = DateTime.Now;\n    public readonly List<string> Tags;\n    public static readonly Guid InstanceId = Guid.NewGuid();\n    \n    public Config()\n    {\n        Tags = new List<string> { "csharp", "tutorial" };\n        // ¡Error! No se puede modificar después del constructor\n        // Tags = new List<string>();\n    }\n}
\n\n

Un detalle importante: readonly protege solo la referencia, no el contenido del objeto. Si tienes un readonly List<int>, no podrás asignar una nueva lista, pero puedes agregar o eliminar elementos sin problema.

\n\n

Comparación de const y readonly: tabla de diferencias

\n\n

Para consolidar el material, aquí tienes una comparación visual:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Criterioconstreadonly
Momento de cálculoCompilaciónEjecución (runtime)
Tipos de datosSolo primitivos + stringCualquier tipo
EstaticidadImplícitamente staticPuede ser static o instance
ModificabilidadNuncaSolo en el constructor
AccesoComo

Blogs

Book Recommendations