Const vs Readonly en C#: ¿cuál es la diferencia y cuándo usar cada uno?
\n\nCada 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.
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\nConst 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,enumynull. \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
newni con tipos de referencia (exceptostring). \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\nCuando 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.
¿Qué es readonly en C#?
\n\nReadonly 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
newo una llamada a un método). \n - No se inserta en el código — es un campo normal con protección contra escritura. \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\nUn 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.
Comparación de const y readonly: tabla de diferencias
\n\nPara consolidar el material, aquí tienes una comparación visual:
\n\n| Criterio | \nconst | \nreadonly | \n
|---|---|---|
| Momento de cálculo | \nCompilación | \nEjecución (runtime) | \n
| Tipos de datos | \nSolo primitivos + string | \nCualquier tipo | \n
| Estaticidad | \nImplícitamente static | \nPuede ser static o instance | \n
| Modificabilidad | \nNunca | \nSolo en el constructor | \n
| Acceso | \nComo
BlogsBook RecommendationsLeer también |