Quina diferència hi ha entre les variables “constants” i “de només lectura” a C #?


Resposta 1:

Des de MSDN:

Les constants són valors immutables que es coneixen a l’hora de compilar i no canvien els seus valors durant la vida del programa.

Les variables de lectura només són valors immutables que es coneixen en temps d'execució i no canvien els seus valors durant la vida del programa.

Definicions, a part, entenem el que això significa realment per a nosaltres.

Usant el codi

Constants:

Les constants es declaren mitjançant una paraula clau "const".

S'ha d'assignar a les constants un valor en el moment de la declaració de variables i, per tant, es coneixen al temps de compilació. Ara sempre que declares una variable constant, el compilador C # substitueix el seu valor directament al llenguatge intermedi (MSIL).

    classe ConstantExpr
    {
        public nombre número int = 3;
    }

    Programa de classe
    {
        static void Main (cadena [] args)
        {
            Console.WriteLine (ConstantExpr.number);
            Console.ReadLine ();
        }
    }

Ara que entenem que el valor es substitueix directament al MSIL, qualsevol modificació que feu a la variable const donaria lloc a una cosa similar a la següent

Programa de classe
    {
        static void Main (cadena [] args)
        {
            // ConstantExpr.number = 15
            // La línia anterior llançaria un error, ja que es converteix internament en una declaració dient 3 = 15
            // que no és vàlid
            Console.WriteLine (ConstantExpr.number);
            Console.ReadLine ();
        }
    }

Per tant, les constants són valors immutables que es coneixen al temps de compilació i no canvien els seus valors durant la vida del programa.

Llegeix només :

Les variables només de lectura són una mica diferents de la del seu col·lega, const.

Les variables de lectura només es coneixen en temps d'execució, es poden assignar un valor tant en temps d'execució com en el moment de la inicialització de la instància. De nou, deixem entendre el codi aquí.

    classe ReadOnlyExpr
    {
        nombre públic int de lectura única = 10;
    }

    Programa de classe
    {
        static void Main (cadena [] args)
        {
            ReadOnlyExpr readOnlyInstance = nou ReadOnlyExpr ();
            Console.WriteLine (readOnlyInstance.number);
        }
    }

Al fragment de codi anterior, se li assigna un valor en la declaració a la variable de només lectura i s’accedeix mitjançant la instància de la classe en lloc d’utilitzar la classe en si. Ara és possible que tingueu una altra instància de la classe, que podria tenir la variable de número de lectura assignada a un valor diferent basat en algunes condicions. Puc fer-ho? Sí, perquè les variables de només lectura són conegudes en temps d'execució.

Provem de fer això:

classe ReadOnlyExpr
{
    nombre públic int de lectura única = 10;
    públic ReadOnlyExpr ()
    {
        nombre = 20;
    }
    public ReadOnlyExpr (bool IsDifferentInstance)
    {
        número = 100;
    }
}

Programa de classe
{
    static void Main (cadena [] args)
    {

        ReadOnlyExpr readOnlyInstance = nou ReadOnlyExpr ();
        Console.WriteLine (readOnlyInstance.number);

        ReadOnlyExpr differentInstance = nou ReadOnlyExpr (true);
        Console.WriteLine (diferentInstance.number);

        Console.ReadLine ();
    }
}

Es mostraran valors diferents sortint del programa per a les dues instàncies diferents de la classe.

Per tant, les variables de només lectura són valors immutables que es coneixen en temps d'execució i no canvien els seus valors durant la vida del programa.


Resposta 2:

Les constants es declaren a l'hora de compilar mitjançant la paraula clau const i s'han d'inicialitzar quan es declaren

El valor de les constants no es pot canviar en temps d'execució.

classe pública CodeViewClass

{

public const int GST18 = 18;

}

Una lectura només és semblant a un comportament constant amb un valor inalterable.

Però la diferència principal és que es pot inicialitzar en temps d'execució en un constructor.

Per obtenir més detalls, utilitzeu a continuació, com ara

clica aquí