Urvalsuttryck - if, if-elseoch switch

Instruktionen if, if-else och switch väljer instruktioner som ska köras från många möjliga sökvägar baserat på värdet för ett uttryck. Instruktionen if kör endast en -instruktion om ett angivet booleskt uttryck utvärderas till true. Med instruktionen if-else kan du välja vilken av de två kodsökvägarna som ska följas baserat på ett booleskt uttryck. Instruktionen switch väljer en instruktionslista som ska köras baserat på en mönstermatchning med ett uttryck.

Instruktionen if

En if instruktion kan vara något av följande två formulär:

  • En if -instruktion med en else del väljer en av de två uttryck som ska köras baserat på värdet för ett booleskt uttryck, som följande exempel visar:

    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!");
        }
    }
    
  • En if instruktion utan en else del kör endast dess brödtext om ett booleskt uttryck utvärderas till true, som följande exempel visar:

    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}");
    }
    

Du kan kapsla if instruktioner för att kontrollera flera villkor, som följande exempel visar:

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}");
    }
}

I en uttryckskontext kan du använda villkorsoperatorn ?: för att utvärdera ett av de två uttrycken baserat på värdet för ett booleskt uttryck.

Instruktionen switch

Instruktionen switch väljer en instruktionslista som ska köras baserat på en mönstermatchning med ett matchningsuttryck, som följande exempel visar:

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;
    }
}

I föregående exempel använder -instruktionen switch följande mönster:

Viktigt!

Information om de mönster som stöds av -instruktionen switchfinns i Mönster.

Föregående exempel visar också fallet default . Fallet default anger instruktioner som ska köras när ett matchningsuttryck inte matchar något annat skiftlägesmönster. Om ett matchningsuttryck inte matchar något skiftlägesmönster och det inte finns något default skiftläge, faller kontrollen igenom en switch -instruktion.

En switch -instruktion kör instruktionslistani det första växelavsnittet vars skiftlägesmönster matchar ett matchningsuttryck och vars skiftlägesskydd, om det finns, utvärderas till true. En switch instruktion utvärderar skiftlägesmönster i textordning uppifrån och ned. Kompilatorn genererar ett fel när en switch instruktion innehåller ett ärende som inte kan nås. Det är ett fall som redan hanteras av ett versaler eller vars mönster är omöjligt att matcha.

Kommentar

Ärendet default kan visas på valfri plats i en switch -instruktion. Oavsett position default utvärderas ärendet endast om alla andra skiftlägesmönster inte matchas eller om -instruktionen goto default; körs i något av växelavsnitten.

Du kan ange flera skiftlägesmönster för ett avsnitt i en switch -instruktion, som följande exempel visar:

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;
    }
}

I en switch instruktion kan kontrollen inte falla igenom från ett växlingsavsnitt till nästa. Som exemplen i det här avsnittet visar använder du vanligtvis -instruktionen break i slutet av varje switch-avsnitt för att skicka kontroll ut ur en switch instruktion. Du kan också använda retur- och utkastsinstruktionernaför att skicka kontrollen från en switch -instruktion. Om du vill imitera fall-through-beteendet och skicka kontroll till andra växelavsnitt kan du använda -instruktionengoto.

I en uttryckskontext kan du använda switch uttrycket för att utvärdera ett enda uttryck från en lista över kandidatuttryck baserat på en mönstermatchning med ett uttryck.

Skiftlägesskydd

Ett skiftlägesmönster kanske inte är tillräckligt uttrycksfullt för att ange villkoret för körningen av switchavsnittet. I sådana fall kan du använda ett skiftlägesskydd. Det är ett ytterligare villkor som måste uppfyllas tillsammans med ett matchat mönster. Ett skiftlägesskydd måste vara ett booleskt uttryck. Du anger ett skiftlägesskydd efter nyckelordet when som följer ett mönster, vilket visas i följande exempel:

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;
    }
}

I föregående exempel används positionsmönster med kapslade relationsmönster.

Språkspecifikation för C#

Mer information finns i följande avsnitt i C#-språkspecifikationen:

Mer information om mönster finns i avsnittet Mönster och mönstermatchning i C#-språkspecifikationen.

Se även