Megosztás a következőn keresztül:


Kijelölési utasítások – if, if-elseés switch

A if, if-else és switch az utasítások számos lehetséges útvonalból kiválasztják a végrehajtandó utasításokat egy kifejezés értéke alapján. Az if utasítás csak akkor hajt végre utasítást, ha egy megadott logikai kifejezés kiértékeli a következőt true: . Az if-else utasítással kiválaszthatja, hogy a két kódútvonal közül melyiket kövesse logikai kifejezés alapján. Az switch utasítás kiválaszt egy utasításlistát, amely egy kifejezéssel egyező minta alapján hajtandó végre.

A if utasítás

Az if utasítás a következő két űrlap bármelyike lehet:

  • Egy if részből álló else utasítás a logikai kifejezés értéke alapján végrehajtandó két utasítás egyikét választja ki, ahogyan az alábbi példa is mutatja:

    DisplayWeatherReport(15.0);  // Output: Cold.
    DisplayWeatherReport(24.0);  // Output: Perfect!
    
    void DisplayWeatherReport(double tempInCelsius)
    {
        if (tempInCelsius < 20.0)
        {
            Console.WriteLine("Cold.");
        }
        else
        {
            Console.WriteLine("Perfect!");
        }
    }
    
  • Egy if rész nélküli else utasítás csak akkor hajtja végre a törzsét, ha egy logikai kifejezés kiértékeli azt true, ahogy az alábbi példa mutatja:

    DisplayMeasurement(45);  // Output: The measurement value is 45
    DisplayMeasurement(-3);  // Output: Warning: not acceptable value! The measurement value is -3
    
    void DisplayMeasurement(double value)
    {
        if (value < 0 || value > 100)
        {
            Console.Write("Warning: not acceptable value! ");
        }
    
        Console.WriteLine($"The measurement value is {value}");
    }
    

Az utasításokat több feltétel ellenőrzéséhez is beágyazhatja if , ahogy az alábbi példa is mutatja:

DisplayCharacter('f');  // Output: A lowercase letter: f
DisplayCharacter('R');  // Output: An uppercase letter: R
DisplayCharacter('8');  // Output: A digit: 8
DisplayCharacter(',');  // Output: Not alphanumeric character: ,

void DisplayCharacter(char ch)
{
    if (char.IsUpper(ch))
    {
        Console.WriteLine($"An uppercase letter: {ch}");
    }
    else if (char.IsLower(ch))
    {
        Console.WriteLine($"A lowercase letter: {ch}");
    }
    else if (char.IsDigit(ch))
    {
        Console.WriteLine($"A digit: {ch}");
    }
    else
    {
        Console.WriteLine($"Not alphanumeric character: {ch}");
    }
}

Kifejezéskörnyezetben a feltételes operátorral ?: kiértékelheti a két kifejezés egyikét egy logikai kifejezés értéke alapján.

A switch utasítás

Az switch utasítás kiválaszt egy utasításlistát, amely egy egyező kifejezéssel egyező minta alapján hajtandó végre, ahogy az alábbi példa is mutatja:

DisplayMeasurement(-4);  // Output: Measured value is -4; too low.
DisplayMeasurement(5);  // Output: Measured value is 5.
DisplayMeasurement(30);  // Output: Measured value is 30; too high.
DisplayMeasurement(double.NaN);  // Output: Failed measurement.

void DisplayMeasurement(double measurement)
{
    switch (measurement)
    {
        case < 0.0:
            Console.WriteLine($"Measured value is {measurement}; too low.");
            break;

        case > 15.0:
            Console.WriteLine($"Measured value is {measurement}; too high.");
            break;

        case double.NaN:
            Console.WriteLine("Failed measurement.");
            break;

        default:
            Console.WriteLine($"Measured value is {measurement}.");
            break;
    }
}

Az előző példában az utasítás a switch következő mintákat használja:

  • Relációs minta: egy kifejezés eredményének összehasonlítása állandóval.
  • Állandó minta: annak tesztelése, hogy egy kifejezés eredménye megegyezik-e egy állandóval.

Fontos

Az utasítás által támogatott mintákról további információt a switchMinták című témakörben talál.

Az előző példa az esetet is szemlélteti default . Az default eset olyan utasításokat ad meg, amelyeket akkor kell végrehajtani, ha egy egyező kifejezés nem egyezik más esetmintával. Ha egy egyező kifejezés nem egyezik a kis- és nagybetűk mintájával, és nincs default eset, akkor a vezérlés egy switch utasításon keresztül történik.

Az switch utasítás végrehajtja az utasításlistát az első kapcsolószakaszban , amelynek a kis- és nagybetűmintája megegyezik egy egyező kifejezéssel, és amelynek esetőrzője , ha van ilyen, kiértékeli a következőt true: . Az switch utasítás a kis- és nagybetűket szöveges sorrendben értékeli felülről lefelé. A fordító hibát okoz, ha egy switch utasítás elérhetetlen esetet tartalmaz. Ez egy olyan eset, amelyet már kezel egy nagybetű, vagy amelynek mintáját lehetetlen egyezni.

Megjegyzés:

Az default eset bármely helyen megjeleníthető egy utasításban switch . A helyzetétől függetlenül a rendszer csak akkor értékeli ki az default esetet, ha az összes többi esetminta nem egyezik meg, vagy az goto default; utasítás végrehajtása az egyik kapcsolószakaszban történik.

Egy utasítás egy szakaszához több esetmintát switch is megadhat, ahogy az alábbi példa is mutatja:

DisplayMeasurement(-4);  // Output: Measured value is -4; out of an acceptable range.
DisplayMeasurement(50);  // Output: Measured value is 50.
DisplayMeasurement(132);  // Output: Measured value is 132; out of an acceptable range.

void DisplayMeasurement(int measurement)
{
    switch (measurement)
    {
        case < 0:
        case > 100:
            Console.WriteLine($"Measured value is {measurement}; out of an acceptable range.");
            break;
        
        default:
            Console.WriteLine($"Measured value is {measurement}.");
            break;
    }
}

switch Egy utasításon belül a vezérlő nem tud átesni egyik kapcsolószakaszból a másikba. Ahogy az ebben a szakaszban látható példák is mutatják, általában az break egyes kapcsolószakaszok végén található utasítással adja át a vezérlőt egy switch utasításból. A visszatérési és dobási utasításokkal is átadhatja az utasítás irányítását switch . Az áteső viselkedés utánzásához és a vezérlő más kapcsolószakaszba való átviteléhez használhatja az utasítástgoto.

Fontos

Minden kapcsolószakasznak egy vagy több breakelemet gotoreturnkell tartalmaznia. Az egyik kapcsolószakaszról a másikra való váltás fordítóhibát okoz. Ugyanahhoz a kapcsolószakaszhoz azonban több kapcsolócímke is alkalmazható, például case < 0: a fenti példában. Ez a szándékos kialakítási választás lehetővé teszi több azonos vagy egymással összefüggő logikával egyező eset tömör kezelését.

A kifejezéskörnyezetben a switch kifejezéssel egyetlen kifejezést értékelhet ki a jelölt kifejezések listájából egy kifejezéssel egyező minta alapján.

Fontos

Különbségek a kapcsolókifejezés és a kapcsolóutasítás között:

  • kapcsolóutasítással szabályozható a végrehajtási folyamat egy kódblokkon belül.
  • a kapcsolókifejezést általában az értékvisszatérés és az érték-hozzárendelés kontextusában használják, gyakran kifejezésre alkalmas tagokként.
  • a kapcsolókifejezések kis- és nagybetűinek szakasza nem lehet üres, egy kapcsolóutasítás is lehet.

Esetőr

Előfordulhat, hogy egy esetminta nem elég kifejező ahhoz, hogy meghatározza a kapcsolószakasz végrehajtásának feltételét. Ilyen esetben használhatja az esetőrt. Ez egy további feltétel, amelyet egy egyeztetett mintával együtt kell teljesíteni. Az esetőrnek logikai kifejezésnek kell lennie. A mintát követő kulcsszó után when egy esetőrt kell megadnia, ahogy az alábbi példa is mutatja:

DisplayMeasurements(3, 4);  // Output: First measurement is 3, second measurement is 4.
DisplayMeasurements(5, 5);  // Output: Both measurements are valid and equal to 5.

void DisplayMeasurements(int a, int b)
{
    switch ((a, b))
    {
        case (> 0, > 0) when a == b:
            Console.WriteLine($"Both measurements are valid and equal to {a}.");
            break;

        case (> 0, > 0):
            Console.WriteLine($"First measurement is {a}, second measurement is {b}.");
            break;

        default:
            Console.WriteLine("One or both measurements are not valid.");
            break;
    }
}

Az előző példa beágyazott relációs mintákkal rendelkező pozíciómintákat használ.

C# nyelvspecifikáció

További információt a C# nyelvspecifikációjának alábbi szakaszaiban talál:

A mintákról további információt a C# nyelv specifikációjánakMinták és mintaegyező szakaszában talál.

Lásd még