Introducción: el eterno debate que no pierde vigencia
Imagina esta situación: estás escribiendo código en C# y necesitas declarar un valor que no debe cambiar. El primer pensamiento es const. El segundo es static readonly. Y el tercero: «¿Y cuál es realmente la diferencia?».
Esta pregunta es una de las más populares en Stack Overflow. Miles de desarrolladores, desde principiantes hasta seniors, siguen debatiendo cuál es mejor. Y en 2025, con el lanzamiento de nuevas versiones de .NET y C# 13, esta elección se ha vuelto aún más interesante.
En este artículo, aclararemos de una vez por todas cuándo usar const y cuándo usar static readonly. No solo aprenderás la teoría, sino que también obtendrás reglas claras que podrás aplicar hoy mismo.
¿Qué se esconde detrás de los modificadores?
const: constante rígida
El modificador const en C# es literalmente un valor «tallado en piedra». Debe conocerse en tiempo de compilación. El compilador sustituye el valor de la constante directamente en el código donde se utiliza.
public class MathConstants{ public const double Pi = 3.14159; public const int DaysInWeek = 7; public const string AppName = "MyApp";}Ten en cuenta: const siempre es implícitamente static. No puedes escribir static const; el compilador mostrará un error.
static readonly: inmutabilidad flexible
El modificador static readonly es un campo que se inicializa una sola vez y nunca más cambia. La principal diferencia: el valor puede calcularse durante la ejecución del programa.
public class AppSettings{ public static readonly DateTime ReleaseDate = new DateTime(2025, 1, 15); public static readonly Guid InstanceId = Guid.NewGuid(); public static readonly string ConfigPath = GetConfigPath(); private static string GetConfigPath() { return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "config.json"); }}Diferencias clave: tabla de comparación rápida
Organicemos todo en una tabla clara:
| Característica | const | static readonly |
|---|---|---|
| Momento de inicialización | Compilación | Ejecución (constructor estático) |
| Tipos permitidos | Solo primitivos (int, double, string, enum, bool) | Cualquier tipo (incluyendo tipos de referencia) |
| Memoria | El valor se copia en cada assembly | Referencia única en memoria |
| Compatibilidad de versiones | Problemas al actualizar librerías | Seguro |
| Rendimiento | Máximo (sustitución en tiempo de compilación) | Pequeña sobrecarga en el primer acceso |
¿Cuándo elegir const?
Usa const cuando:
- El valor es absolutamente inmutable — constantes matemáticas (π, e), número de días de la semana, constantes físicas.
- El valor debe estar disponible en tiempo de compilación — por ejemplo, para atributos, switch/case, parámetros por defecto.
- Controlas todo el código — y estás seguro de que la librería no se actualizará por separado.
// Ideal para constpublic class Physics{ public const double SpeedOfLight = 299792458; // m/s public const double GravitationalConstant = 6.67430e-11; // m³/(kg·s²)}
// Uso en un atributo —