選択ステートメント - if
、if-else
と switch
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
ステートメントに次のパターンが使用されています。
- リレーショナル パターン: 式の結果と定数を比較します。
- 定数パターン: 式の結果が定数と等しいかどうかをテストします。
重要
switch
ステートメントでサポートされるパターンについては、「パターン」を参照してください。
上の例では、default
ケースも示されています。 default
ケースでは、一致式が他のどのケース パターンとも一致しない場合に実行するステートメントを指定します。 一致式がケース パターンと一致しておらず、default
ケースがない場合は、制御で switch
ステートメントがフォールスルーされます。
switch
ステートメントでは、''ケース パターン'' が一致式と一致し、ケース ガード (存在する場合) が true
と評価される最初の ''switch セクション'' で ''ステートメント リスト'' を実行します。 switch
ステートメントでは、ケース パターンをテキスト順に上から下に評価します。 switch
ステートメントに到達できないケースが含まれている場合、コンパイラによってエラーが生成されます。 これは、大文字で既に処理されているか、そのパターンを一致させることができない場合です。
Note
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# 言語仕様」の次のセクションを参照してください。
パターンの詳細については、C# 言語仕様のパターンとパターン マッチングセクションを参照してください。
関連項目
.NET