C#: 条件文
1. if文
if文は、ブール式の評価結果に基づいてコードブロックを実行します。条件が真の場合、そのブロックが実行され、偽の場合はスキップされます。
int score = 85;
if (score >= 60)
{
Console.WriteLine("Passed");
}
Passed
2. if...else 文
if...else を使用すると、条件が真のときは一方の分岐を、偽のときはもう一方の分岐を実行できます。
int age = 16;
if (age >= 18)
{
Console.WriteLine("Adult");
}
else
{
Console.WriteLine("Minor");
}
Minor
3. if...else if による複数の分岐
互いに排他的な複数の条件を確認する必要がある場合は、else if を使用してそれらを順番に判定します。最初に条件に一致した分岐のみが実行されます。
int score = 78;
if (score >= 90)
{
Console.WriteLine("Excellent");
}
else if (score >= 80)
{
Console.WriteLine("Good");
}
else if (score >= 60)
{
Console.WriteLine("Pass");
}
else
{
Console.WriteLine("Fail");
}
Pass
4. ネストされたif文
if文はネストできますが、ネストは2階層以内に抑えるようにしてください。深くネストしすぎると可読性が低下します。その場合は、メソッドを抽出するか、代わりにelse ifを使用することを検討してください。
▶ サンプル
int age = 25;
bool hasTicket = true;
if (age >= 18)
{
if (hasTicket)
{
Console.WriteLine("Admitted");
}
else
{
Console.WriteLine("Ticket required");
}
}
else
{
Console.WriteLine("Too young");
}
Admitted
5. switch文
switch文は、式を複数の定数値と照合し、対応するcase分岐を実行します。C/C++とは異なり、C#ではフォールスルーは許可されていません。各caseはbreak、return、またはthrowで終了しなければならず、そうでない場合はコンパイルエラーが発生します。
▶ サンプル
int day = 3;
switch (day)
{
case 1:
Console.WriteLine("Monday");
break;
case 2:
Console.WriteLine("Tuesday");
break;
case 3:
Console.WriteLine("Wednesday");
break;
case 4:
Console.WriteLine("Thursday");
break;
case 5:
Console.WriteLine("Friday");
break;
default:
Console.WriteLine("Weekend");
break;
}
Wednesday
複数のケースで、ラベルを連続して列挙することで、同じロジックを共有することができます:
int month = 2;
switch (month)
{
case 12:
case 1:
case 2:
Console.WriteLine("Winter");
break;
case 3:
case 4:
case 5:
Console.WriteLine("Spring");
break;
default:
Console.WriteLine("Other season");
break;
}
Winter
ヒント:C#では、あるケースから別のケースへ確実にジャンプする必要がある場合は、
goto case xを使用する必要があります。フォールスルー(breakを省略して次のケースへ進むこと)は許可されていません。
6. switch式(C# 8以降)
C# 8 では、switch 式が導入されました。これは文ではなく式であり、より簡潔な構文で一致した結果を返します。デフォルト分には _ を使用してください。
▶ サンプル
int code = 404;
string message = code switch
{
200 => "OK",
301 => "Moved",
404 => "Not Found",
500 => "Server Error",
_ => "Unknown"
};
Console.WriteLine(message);
Not Found
7. パターンマッチングの基礎
C# 7 以降では、条件分岐のロジックでパターンマッチングを使用できるようになりました。一般的な形式としては、型パターン (is Type variable) や when ガードなどがあります。
▶ サンプル
object obj = "Hello C#";
if (obj is string s)
{
Console.WriteLine($"String length: {s.Length}");
}
else
{
Console.WriteLine("Not a string");
}
String length: 8
switch文でwhen節を使って、条件を追加します:
int value = 15;
string category = value switch
{
int i when i > 100 => "Extra large",
int i when i > 10 => "Medium",
int i when i > 0 => "Small",
_ => "Invalid"
};
Console.WriteLine(category);
Medium
8. 条件演算子 ?:
条件演算子 ?:(三項演算子とも呼ばれる)は、if...else の省略形です。構文は condition ? valueIfTrue : valueIfFalse であり、式全体が対応する値として評価されます。
▶ サンプル
int age = 20;
string status = age >= 18 ? "Adult" : "Minor";
Console.WriteLine(status);
Adult
ネストされた使用法(過度なネストは避ける):
int score = 75;
string result = score >= 90 ? "A" : score >= 60 ? "B" : "C";
Console.WriteLine(result);
B
警告:条件演算子を 2 レベル以上ネストすると、可読性が著しく低下します。代わりに if...else if 文を使用してください。
❓ よくある質問
=>とコンマ区切りの分岐節を使用し、値を返さなければならない式です。switch文は、case/breakブロックを使用し、戻り値を必要としない文です。is と == の違いは何ですか?==は値の等価性を比較するのに対し、isはパターンマッチングに使用され、変数を宣言する際に型をチェックすることができます(例:obj is string s)。📖 まとめ
- if文は、ブール条件に基づいてコードブロックを実行します
- if...else は二方向の分岐を実現し、else if は互いに排他的な複数の条件を処理します
- 可読性を高めるため、ネストされたif文は2階層以内に抑えてください
- switch文は定数値と照合します。C#ではフォールスルーが禁止されており、break、return、またはthrowの使用が必須です。
- switch式(C# 8+)は、デフォルト値に
_を使用する、簡潔で値を返す代替手段です。 - パターンマッチングでは、
is Type varを使用して型をチェックし、値を抽出します。ガードによって追加の条件が加わる場合 - 条件演算子
?:は、単純な双方向代入を簡略化します
📝 練習問題
- 整数を入力し、それが正、負、またはゼロのいずれであるかを判定して、その結果を出力するプログラムを作成してください。
- switch式を使用して、月(1~12)をそれに対応する季節名に割り当てる
- オブジェクト変数を受け取り、
isのパターンマッチングを用いてその型(int、string、またはその他)を判定し、型と値を出力するプログラムを作成してください。 - 条件演算子を使用して、数値の得点を文字評価に変換し(90以上はA、80以上はB、60以上はC、それ以外はD)、その読みやすさをif...else if構文を使ったバージョンと比較する