Selection ステートメント - if
、、 else
および switch
、else
および switch
ステートメントはif
、式の値に基づいて、可能な多くのパスから実行するステートメントを選択します。 ステートメントはif
、ブール式の値に基づいて実行するステートメントを選択します。 ステートメントを 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
ステートメントに次のパターンが使用されています。
- リレーショナル パターン (C# 9.0 以降で使用可能): 式の結果と定数を比較します。
- 定数パターン: 式の結果が定数と等しいかどうかをテストします。
重要
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
ステートメントの詳細については、機能の提案に関する次の記述を参照してください。