Delen via


Selectie-instructies - if, if-elseen switch

De ifen if-elseswitch instructies selecteren instructies die moeten worden uitgevoerd vanuit veel mogelijke paden op basis van de waarde van een expressie. De if instructie voert alleen een instructie uit als een opgegeven Boole-expressie resulteert in true. if-else Met de instructie kunt u kiezen welke van de twee codepaden u wilt volgen op basis van een Boole-expressie. Met switch de instructie wordt een instructielijst geselecteerd die moet worden uitgevoerd op basis van een patroonovereenkomst met een expressie.

De if instructie

Een if instructie kan een van de volgende twee vormen zijn:

  • Een if instructie met een else onderdeel selecteert een van de twee instructies die moeten worden uitgevoerd op basis van de waarde van een Boole-expressie, zoals in het volgende voorbeeld wordt weergegeven:

    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!");
        }
    }
    
  • Een if instructie zonder else onderdeel voert alleen de hoofdtekst uit als een Boole-expressie resulteert in een booleaanse trueexpressie, zoals in het volgende voorbeeld wordt weergegeven:

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

U kunt instructies nesten if om meerdere voorwaarden te controleren, zoals in het volgende voorbeeld wordt weergegeven:

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

In een expressiecontext kunt u de voorwaardelijke operator ?: gebruiken om een van de twee expressies te evalueren op basis van de waarde van een Boole-expressie.

De switch instructie

De switch instructie selecteert een instructielijst die moet worden uitgevoerd op basis van een patroonovereenkomst met een overeenkomstexpressie, zoals in het volgende voorbeeld wordt weergegeven:

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

In het voorgaande voorbeeld gebruikt de switch instructie de volgende patronen:

Belangrijk

Zie Patronen voor informatie over de patronen die door de switch instructie worden ondersteund.

In het voorgaande voorbeeld ziet u ook de default case. In de default case worden instructies opgegeven die moeten worden uitgevoerd wanneer een overeenkomstexpressie niet overeenkomt met een ander casepatroon. Als een overeenkomstexpressie niet overeenkomt met een casepatroon en er geen default case is, valt het besturingselement door een switch instructie.

Met een switch instructie wordt de lijst met instructies uitgevoerd in de eerste switchsectie waarvan het casepatroon overeenkomt met een overeenkomstexpressie en waarvan de case guard, indien aanwezig, resulteert in true. Een switch instructie evalueert hoofdletterpatronen in tekstvolgorde van boven naar beneden. De compiler genereert een fout wanneer een switch instructie een onbereikbare case bevat. Dat is een geval dat al wordt verwerkt door een hoofdletter of waarvan het patroon onmogelijk is om overeen te komen.

Notitie

De default case kan op elke plaats binnen een switch instructie worden weergegeven. Ongeacht de positie ervan wordt de default case alleen geëvalueerd als alle andere casepatronen niet overeenkomen of de goto default; instructie wordt uitgevoerd in een van de switchsecties.

U kunt meerdere casepatronen opgeven voor één sectie van een switch instructie, zoals in het volgende voorbeeld wordt weergegeven:

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

Binnen een switch instructie kan het besturingselement niet van de ene schakelsectie naar de volgende vallen. Zoals in de voorbeelden in deze sectie wordt weergegeven, gebruikt u meestal de break instructie aan het einde van elke switchsectie om het besturingselement uit een switch instructie door te geven. U kunt ook de retour- en throw-instructies gebruiken om controle uit een switch instructie door te geven. Als u het fallthrough-gedrag wilt imiteren en het besturingselement wilt doorgeven aan een andere switchsectie, kunt u de goto instructie gebruiken.

In een expressiecontext kunt u de switch expressie gebruiken om één expressie te evalueren uit een lijst met kandidaat-expressies op basis van een patroonovereenkomst met een expressie.

Case guards

Een casepatroon kan niet expressief genoeg zijn om de voorwaarde op te geven voor de uitvoering van de switchsectie. In dat geval kunt u een case guard gebruiken. Dat is een extra voorwaarde waaraan moet worden voldaan, samen met een overeenkomend patroon. Een case guard moet een Boole-expressie zijn. U geeft een hoofdletterbeveiliging op na het when trefwoord dat een patroon volgt, zoals in het volgende voorbeeld wordt weergegeven:

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

In het voorgaande voorbeeld worden positionele patronen met geneste relationele patronen gebruikt.

C#-taalspecificatie

Zie de volgende secties van de C#-taalspecificatie voor meer informatie:

Zie de sectie Patronen en patroonkoppeling van de C#-taalspecificatie voor meer informatie over patronen.

Zie ook