選択ステートメント -
if
、if-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
すべての スイッチ セクション は、 break
、 goto
、または 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# 言語仕様の「パターンとパターン マッチング」セクションを参照してください。
こちらも参照ください
.NET