次の方法で共有


選択ステートメント - ifif-else、および switch

ifif-else、およびswitchステートメントは、式の値に基づいて、多くの可能なパスから実行するステートメントを選択します。 if ステートメントは、指定されたブール式がtrueに評価された場合にのみステートメントを実行します。 if-else ステートメントを使用すると、ブール式に基づいて、2 つのコード パスのうちどれをフォローするかを選択できます。 switch ステートメントは、式とのパターン一致に基づいて実行するステートメント リストを選択します。

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 ステートメントは次のパターンを使用します。

Von Bedeutung

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

前の例では、 default ケースも示しています。 defaultケースは、一致式が他のケース パターンと一致しない場合に実行するステートメントを指定します。 一致式が大文字と小文字のパターンに一致せず、 default ケースがない場合、コントロールは switch ステートメントを通過します。

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

defaultケースは、switchステートメント内の任意の場所に表示できます。 その位置に関係なく、 default ケースは、他のすべてのケース パターンが一致しない場合、または switch セクションのいずれかで 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 ステートメントを使用できます。

Von Bedeutung

すべての スイッチ セクション は、 breakgoto 、または returnで終わる必要があります。 ある switch セクションから次のセクションに進むと、コンパイラ エラーが発生します。 ただし、上の例の case < 0: のように、同じスイッチ セクションに複数のスイッチ ラベルを適用できます。 この意図的な設計の選択により、同じまたは相互に依存するロジックを共有する複数のケースを簡潔に処理できます。

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

Von Bedeutung

switch 式switch ステートメントの違い:

  • switch ステートメント は、コード ブロック内の実行フローを制御するために使用されます。
  • switch 式 は通常、値の戻り値と値の代入のコンテキストで使用されます。多くの場合、 式形式のメンバーとして使用されます。
  • switch 式の case セクションを空にすることはできません。switch ステートメントを使用できます。

ケースガード

ケース パターンは、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# 言語仕様」の次のセクションを参照してください。

パターンの詳細については、C# 言語仕様「パターンとパターン マッチング」セクションを参照してください。

こちらも参照ください