選択ステートメント (C# リファレンス)

次のステートメントでは、式の値に基づいて、使用可能な多数のステートメントから実行するステートメントを選択します。

if ステートメント

if ステートメントは、次の 2 つのフォームのいずれかにすることができます。

  • 次の例に示すように、else 部分がある if ステートメントでは、ブール式の値に基づいて実行する 2 つのステートメントのいずれかを選択します。

    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!");
        }
    }
    
  • 次の例に示すように、else 部分のない if ステートメントでは、ブール式が true と評価された場合にのみ、その本体を実行します。

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

次の例に示すように、if ステートメントを入れ子にし、複数の条件を確認できます。

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

式コンテキストでは、条件演算子 ?: を使用して、ブール式の値に基づいて 2 つの式のいずれかを評価できます。

switch ステートメント

switch ステートメントでは、次の例に示すように、一致式とのパターン一致に基づいて実行するステートメント リストを選択します。

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

上記の例では、switch ステートメントに次のパターンが使用されています。

重要

switch ステートメントでサポートされるパターンについては、「パターン」を参照してください。

上の例では、default ケースも示されています。 default ケースでは、一致式が他のどのケース パターンとも一致しない場合に実行するステートメントを指定します。 一致式がケース パターンと一致しておらず、default ケースがない場合は、制御で switch ステートメントがフォールスルーされます。

switch ステートメントでは、''ケース パターン'' が一致式と一致し、ケース ガード (存在する場合) が true と評価される最初の ''switch セクション'' で ''ステートメント リスト'' を実行します。 switch ステートメントでは、ケース パターンをテキスト順に上から下に評価します。 switch ステートメントに到達できないケースが含まれている場合、コンパイラによってエラーが生成されます。 これは、大文字で既に処理されているか、そのパターンを一致させることができない場合です。

注意

default ケースは、switch ステートメント内の任意の順序で指定できます。 その位置に関係なく、 default ケースは常に最後に評価され、他のすべてのケース パターンが一致しない場合 (が検出された場合 goto default を除く) のみが評価されます。

次の例に示すように、switch ステートメントの 1 つのセクションに複数のケース パターンを指定できます。

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 ステートメント内では、制御はある switch セクションから次のセクションにフォールスルーすることはできません。 このセクションの例に示すとおり、通常は、各 switch セクションの最後で break ステートメントを使用して、switch ステートメントから制御を渡します。 return および throw ステートメントを使用して、switch ステートメントから制御を渡すこともできます。 フォールスルー動作を模倣し、他の switch セクションに制御を渡す場合は、goto ステートメントを使用できます。

式コンテキストでは、switchを使用して、式とのパターン一致に基づいて、候補式リストの 1 つの式を評価できます。

ケース ガード

switch セクションの式の条件を指定するのに十分な表現がケース パターンにない場合があります。 このような場合は、''ケース ガード'' を使用できます。 これは、パターンの一致と共に満たされる必要がある追加条件です。 ケース ガードはブール式にする必要があります。 次の例に示すように、パターンの後に続く when キーワードの後に、ケース ガードを指定します。

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

前の例では、リレーショナル パターンが入れ子になっている位置指定パターンを使用しています。

C# 言語仕様

詳細については、「C# 言語仕様」の次のセクションを参照してください。

パターン マッチング switch ステートメントの詳細については、機能の提案に関する次の記述を参照してください。

関連項目