csharp – Diferencias de compilación entre readonly y const

Este tema nació a partir de un problema que salió luego de desplegar una aplicación en un ambiente de pruebas, el error indicaba que no se había cambiado el nombre de un SP que estaba en una constante de un componente externo. Luego de encontrar el problema fue que se originó la pregunta ¿Cuál es la diferencia de una constante con una variable de solo lectura a nivel de compilación? Aunque parezca un tema sencillo a veces no muchos lo conocen.

Constantes (Const)

Son un tipo de variable que su valor no puede ser modificado durante la ejecución de un programa, por ese motivo es denominado constante. Para declarar una constante usamos el keyword const y para usarla no se debe declarar una instancia de la clase, se puede decir que se usa como si fuese una variable static.

public class Constantes
{
    public const string CodigoAplicacion = "APP001REMOTE";
}

Los invito a leer la referencia de C# sobre constantes.

ReadOnly

A diferencia de las constantes las variables de solo lectura pueden cambiar su valor dentro del constructor de la clase o con un valor definido en su declaración. Para declarar una variable de solo lectura usamos el keyword readonly y para usarla se debe declarar una instancia de la clase.

NOTA: Para acceder directamente a la variable de solo lectura sin instanciar una clase se puede marcar como static.

public class SoloLectura
{
    public readonly string EmailNotificacion;
    public readonly string Codigo = "App001";

    public SoloLectura()
    {
        EmailNotificacion = "prueba@gmail.com";
    }

    public SoloLectura(string email)
    {
        EmailNotificacion = email;
    }
}

Los invito a leer la referencia de C# sobre variables readonly.

Ejemplo

Ahora vamos a usar estos 2 tipos de variables y luego veremos cómo se generan a nivel de compilación:

public class Cliente
{
    public Cliente()
    {
        //Constante
        Iniciar(Constantes.CodigoAplicacion);

        //Variable solo lectura
        var soloLectura = new SoloLectura("email@prueba.com");
        Notificar(soloLectura.EmailNotificacion);
    }

    public void Iniciar(string codigoAplicacion){}

    public void Notificar(string email){}
}

Ahora necesitamos decompilar el componente para ver cómo se compila el código escrito, para este caso se puede usar cualquier herramienta para decompilar una DLL, en mi caso lo hice usando dotPeek de JetBrains, aunque también se hubiera podido hacer usando .Net Reflector de Red-Gate.

Const vs ReadOnly
Const vs ReadOnly

Como se ve en la imagen el lugar donde se encontraba la constante fue reemplazado por el valor que tenía declarado en la clase «APP01REMOTE», en cambio la variable de solo lectura queda de la misma forma tomando el valor que se envía por el constructor de la clase.

Conclusiones:

Las constantes no pueden cambiar su valor en tiempo de ejecución, por otro lado las variables de solo lectura si tienen esta característica, pero solo cuando se instancia una clase. Así que recuerden si hacen un pase y necesitan que se actualice el valor de una constante no solo actualicen el componente donde se declaran las constantes sino también se debe actualizar el componente que las usa ya que el valor de la constante ya viene quemado o hardcode dentro ;).

Referencias:
Metal Tip:

Este artículo lo escribí escuchando la canción Scream bloody gore de la banda Death de Usa, les comparto el enlace.

Happy coding and Stay Heavy lml