Jaký je rozdíl mezi „konstantními“ a „čitelnými“ proměnnými v C #?


Odpověď 1:

Z MSDN:

Konstanty jsou neměnné hodnoty, které jsou známy v době kompilace a nemění jejich hodnoty po celou dobu životnosti programu.

Proměnné pouze pro čtení jsou také neměnné hodnoty, které jsou známy za běhu a nemění jejich hodnoty po celou dobu životnosti programu.

Hmm .. definicemi, rozumíme, co to pro nás ve skutečnosti znamená.

Pomocí kódu

Konstanty:

Konstanty jsou deklarovány pomocí klíčového slova „const“.

Konstantám by měla být přiřazena hodnota v době deklarace proměnné, a proto jsou známy v době kompilace. Nyní, kdykoli deklarujete konstantní proměnnou, kompilátor C # nahradí svou hodnotu přímo do mezilehlého jazyka (MSIL).

    třída ConstantExpr
    {
        veřejné konst. číslo int = 3;
    }

    program třídy
    {
        static void Main (řetězec [] args)
        {
            Console.WriteLine (ConstantExpr.number);
            Console.ReadLine ();
        }
    }

Nyní, když chápeme, že hodnota je přímo nahrazena v MSIL, by jakékoli změny konstantní proměnné vedly k něčemu podobnému níže

program třídy
    {
        static void Main (řetězec [] args)
        {
            // ConstantExpr.number = 15
            // Výše ​​uvedený řádek by vyvolal chybu, protože se z vnitřní strany stane prohlášení, které říká 3 = 15
            // což není platné
            Console.WriteLine (ConstantExpr.number);
            Console.ReadLine ();
        }
    }

Konstanty jsou tedy neměnné hodnoty, které jsou známy v době kompilace a nemění jejich hodnoty po celou dobu životnosti programu.

Pouze ke čtení :

Proměnné pouze pro čtení se trochu liší od jejich kolegy, konst.

Proměnné pouze pro čtení jsou známé za běhu, mohou jim být přiřazena hodnota buď za běhu, nebo v době inicializace instance. Opět umožňuje pochopit prostřednictvím kódu zde.

    třída ReadOnlyExpr
    {
        veřejné číslo intonně čitelné = 10;
    }

    program třídy
    {
        static void Main (řetězec [] args)
        {
            ReadOnlyExpr readOnlyInstance = new ReadOnlyExpr ();
            Console.WriteLine (readOnlyInstance.number);
        }
    }

Ve výše uvedeném úryvku kódu je proměnné typu readonly přiřazena hodnota v době deklarace a je přístupná pomocí instance třídy, nikoli pomocí samotné třídy. Nyní můžete mít další instanci třídy, která by mohla mít proměnnou typu readonly number přiřazenou k jiné hodnotě na základě některých podmínek. Mohu to udělat? Ano, protože proměnné typu readonly jsou známy za běhu.

Zkusme to udělat:

třída ReadOnlyExpr
{
    veřejné číslo intonně čitelné = 10;
    veřejné ReadOnlyExpr ()
    {
        číslo = 20;
    }
    public ReadOnlyExpr (bool IsDifferentInstance)
    {
        číslo = 100;
    }
}

program třídy
{
    static void Main (řetězec [] args)
    {

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

        ReadOnlyExpr differentInstance = new ReadOnlyExpr (true);
        Console.WriteLine (differentInstance.number);

        Console.ReadLine ();
    }
}

Uvidíte různé hodnoty vycházející z výstupu programu pro dvě různé instance třídy.

Proměnné Readonly jsou tedy také neměnné hodnoty, které jsou známy za běhu a nemění jejich hodnoty po celou dobu životnosti programu.


Odpověď 2:

Konstanty jsou deklarovány v době kompilace pomocí klíčového slova const a musí být inicializovány, když jsou deklarovány

Hodnotu konstant nelze změnit za běhu.

veřejná třída CodeViewClass

{

public const int GST18 = 18;

}

Čtení je podobné neustálému chování s neměnnou hodnotou.

Hlavní rozdíl je v tom, že může být inicializován za běhu v konstruktoru.

Další podrobnosti použijte níže

klikněte zde