ヒント
この記事は、少なくとも 1 つのプログラミング言語を既に知っており、C# を学習している開発者向けの 基礎 セクションの一部です。 プログラミングを初めて使用する場合は、最初に「 はじめ に」チュートリアルから始めてください。 完全な構文については、言語リファレンスの 選択ステートメント を参照してください。
別の言語から来ていますか? C++、Java、JavaScript はすべて C の遺産を共有しているため、C# で同じif、else、switch読み取ることができます。 注目すべき 1 つの違いは、C# は空でない switch ケース間のフォールスルーを禁止し、各 case ラベルは定数ではなく パターン をテストできます。 Pythonから取得した場合、C# のif/else if/elseはif/elif/elseにマップされ、C# のパターンベースのswitchはPythonのmatchステートメントに最も近い値になります。
選択ステートメントは、条件に基づいて実行されるコード ブロックを選択します。 C# には、ブール値で分岐するための if (省略可能な else) と、1 つの値を複数のケースと比較するための switch の 2 つがあります。
ブール式は、比較trueなど、falseまたはtemperature >= 25に評価される任意の式です。
if と else によって分岐する
if ステートメントは、そのブール式がtrueされている場合にのみブロックを実行します。 条件がelseされたときに実行されるコードを提供するfalse ブロックを追加します。
int temperature = 28;
// An if statement runs its block only when the condition is true.
// The else block runs when the condition is false.
if (temperature >= 25)
{
Console.WriteLine("Warm"); // => Warm
}
else
{
Console.WriteLine("Cool");
}
ifまたはelseの本体は、割り当てやメソッド呼び出しなどの単一のステートメントです。
ブロック ステートメント自体は、0 個以上のステートメントを中かっこ ({ }) で囲む単一のステートメントです。
多くのコーディング標準では、ステートメントが単一でも、分岐本体は中かっこで囲むよう推奨しています。 中かっこで範囲を明示的にします。 これは一般的な間違いを防ぎます。条件付きで実行されることを期待する 2 行目を後で追加しますが、代わりに無条件で実行されます。 どのステートメントがその分岐に属するかが判断されるのは中かっこのみです。 C# は空白を重要なものとして扱わないので、インデントだけでは決して行われません。 中かっこは内容が 1 行であっても正式: ブロックは分岐が実行される単一のステートメントです。 コードにインデントをつけると読みやすくなりますが、ブロックを定義するには中かっこを頼みにしてください。
で複数の条件をテストする else if
2 つ以上のパスの中から選択するには、 else ifを使用して条件を連結します。 C# は、各条件を順番に評価し、条件が trueされた最初のブロックを実行してから、残りのブロックをスキップします。 最後の else は、残りのすべてのケースを処理します。
int score = 82;
// Chain conditions with else if. The first branch whose condition is
// true runs; the compiler skips the rest.
string grade;
if (score >= 90)
{
grade = "A";
}
else if (score >= 80)
{
grade = "B";
}
else if (score >= 70)
{
grade = "C";
}
else
{
grade = "F";
}
Console.WriteLine(grade); // => B
順序はチェーン内で重要です。 最初の一致条件が優先されるため、最も具体的な条件を最初に配置します。 前の例では、score >= 80前にscore >= 70をテストすると、スコア 82 が"B"ではなく"C"にマップされます。
値を switch ステートメントと一致させる
1 つの値を多数の個別のケースと比較すると、 switch ステートメントは長い else if チェーンよりも明確に読み取ります。
ifと同様に、switch ステートメントは分岐ステートメントであり、実行するコードを選択します。 各 case ラベルには一致する値が一覧表示され、各 case セクションは break ステートメントで終わります。 スタック ラベルで 1 つの本体を共有し、大文字小文字が一致しない値には default セクションを使用します。
DayOfWeek day = DayOfWeek.Saturday;
// A switch statement compares one value against several case labels.
// Stacked labels share a body. Each section ends with break, and the
// default section runs when no case matches.
switch (day)
{
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
Console.WriteLine("Weekend"); // => Weekend
break;
default:
Console.WriteLine("Weekday");
break;
}
C および Java とは異なり、C# では、空でない 1 つのcaseセクションから次のセクションへ実行がそのまま移ることは許可されていません。 コードを含むセクションはすべて、 break (または return や gotoなどの別のジャンプ ステートメント) で終わる必要があります。 このルールは、これらの言語で一般的な誤ったフォールスルーバグを防ぎます。
case と when を使用したテスト パターン
case ラベルは定数値に限定されません。
パターンをテストできます。これは、データの図形または値を記述するルールです。
< 0などのリレーショナル パターンは、0 未満の値と一致します。
when句を追加して、ケースを一致させるためにさらにtrueである必要がある追加条件を指定します。
int measurement = 42;
// A case label can test a pattern instead of a constant. A when clause
// adds a condition that must also be true for the case to match.
switch (measurement)
{
case < 0:
Console.WriteLine("Negative");
break;
case 0:
Console.WriteLine("Zero");
break;
case > 0 when measurement % 2 == 0:
Console.WriteLine("Positive and even"); // => Positive and even
break;
default:
Console.WriteLine("Positive and odd");
break;
}
パターンベースのケースは上から下に評価されるため、より一般的なパターンの前に、より具体的なパターンが属します。 パターンの完全なカタログについては、 パターン マッチングを参照してください。
式を使用して値を選択する
ifステートメントとswitch ステートメントによって、実行されるコードが決まる。 代わりに 値を選択する必要がある場合は、式を使用 します。 式は値に評価されるため、代入の右側やメソッド引数など、値が必要な任意の場所で式を使用できます。 C# には、条件演算子や switch 式などの代替候補から値を選択する式フォームが用意されています。
条件演算子 ?:
条件演算子 ?: は、ブール条件に基づいて 2 つの値のいずれかを選択します。
その構文、短絡動作、および if/else の代わりにこれを選択する際のガイダンスについては、条件演算子?: を参照してください。
switch 式
switch式は、switch ステートメントに対応する式です。 一致したケースのコードを実行するのではなく、値として評価されます。 これは、 switch ステートメントの各アームに値を割り当てるよりも簡潔であり、可能なすべての入力がアームでカバーされていない場合、コンパイラから警告が表示されます。
switch式は、パターン マッチングの中核となる部分です。 パターン マッチングのタイミングと使用方法については、 パターン マッチング と switch 式 のリファレンスを参照してください。
こちらも参照ください
.NET