C#: 条件文

1. if文

if文は、ブール式の評価結果に基づいてコードブロックを実行します。条件が真の場合、そのブロックが実行され、偽の場合はスキップされます。

CSHARP
int score = 85;
if (score >= 60)
{
    Console.WriteLine("Passed");
}
TEXT 📖 参照専用
Passed

2. if...else 文

if...else を使用すると、条件が真のときは一方の分岐を、偽のときはもう一方の分岐を実行できます。

CSHARP
int age = 16;
if (age >= 18)
{
    Console.WriteLine("Adult");
}
else
{
    Console.WriteLine("Minor");
}
TEXT 📖 参照専用
Minor

3. if...else if による複数の分岐

互いに排他的な複数の条件を確認する必要がある場合は、else if を使用してそれらを順番に判定します。最初に条件に一致した分岐のみが実行されます。

CSHARP
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");
}
TEXT 📖 参照専用
Pass

4. ネストされたif文

if文はネストできますが、ネストは2階層以内に抑えるようにしてください。深くネストしすぎると可読性が低下します。その場合は、メソッドを抽出するか、代わりにelse ifを使用することを検討してください。

▶ サンプル

CSHARP
int age = 25;
bool hasTicket = true;
if (age >= 18)
{
    if (hasTicket)
    {
        Console.WriteLine("Admitted");
    }
    else
    {
        Console.WriteLine("Ticket required");
    }
}
else
{
    Console.WriteLine("Too young");
}
▶ 試してみよう
TEXT 📖 参照専用
Admitted

5. switch文

switch文は、式を複数の定数値と照合し、対応するcase分岐を実行します。C/C++とは異なり、C#ではフォールスルーは許可されていません。各caseはbreak、return、またはthrowで終了しなければならず、そうでない場合はコンパイルエラーが発生します。

▶ サンプル

CSHARP
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;
}
▶ 試してみよう
TEXT 📖 参照専用
Wednesday

複数のケースで、ラベルを連続して列挙することで、同じロジックを共有することができます:

CSHARP
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;
}
TEXT 📖 参照専用
Winter

ヒント:C#では、あるケースから別のケースへ確実にジャンプする必要がある場合は、goto case x を使用する必要があります。フォールスルー(breakを省略して次のケースへ進むこと)は許可されていません。


6. switch式(C# 8以降)

C# 8 では、switch 式が導入されました。これは文ではなく式であり、より簡潔な構文で一致した結果を返します。デフォルト分には _ を使用してください。

▶ サンプル

CSHARP
int code = 404;
string message = code switch
{
    200 => "OK",
    301 => "Moved",
    404 => "Not Found",
    500 => "Server Error",
    _ => "Unknown"
};
Console.WriteLine(message);
▶ 試してみよう
TEXT 📖 参照専用
Not Found

7. パターンマッチングの基礎

C# 7 以降では、条件分岐のロジックでパターンマッチングを使用できるようになりました。一般的な形式としては、型パターン (is Type variable) や when ガードなどがあります。

▶ サンプル

CSHARP
object obj = "Hello C#";
if (obj is string s)
{
    Console.WriteLine($"String length: {s.Length}");
}
else
{
    Console.WriteLine("Not a string");
}
▶ 試してみよう
TEXT 📖 参照専用
String length: 8

switch文でwhen節を使って、条件を追加します:

CSHARP
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);
TEXT 📖 参照専用
Medium

8. 条件演算子 ?:

条件演算子 ?:(三項演算子とも呼ばれる)は、if...else の省略形です。構文は condition ? valueIfTrue : valueIfFalse であり、式全体が対応する値として評価されます。

▶ サンプル

CSHARP
int age = 20;
string status = age >= 18 ? "Adult" : "Minor";
Console.WriteLine(status);
▶ 試してみよう
TEXT 📖 参照専用
Adult

ネストされた使用法(過度なネストは避ける):

CSHARP
int score = 75;
string result = score >= 90 ? "A" : score >= 60 ? "B" : "C";
Console.WriteLine(result);
TEXT 📖 参照専用
B

警告:条件演算子を 2 レベル以上ネストすると、可読性が著しく低下します。代わりに if...else if 文を使用してください。

❓ よくある質問

Q C#のswitch文では、C言語のようにfall-through(条件分岐の連続実行)のためにbreakを省略できますか?
A いいえ。C#ではswitch文のfall-throughは許可されていません。各caseはbreak、return、またはthrowで終了しなければならず、そうでない場合はコンパイルエラーが発生します。ロジックを共有するには、複数のcaseラベルを連続して記述してください。
Q switch式とswitch文の違いは何ですか?
A switch式は、=>とコンマ区切りの分岐節を使用し、値を返さなければならない式です。switch文は、case/breakブロックを使用し、戻り値を必要としない文です。
Q is== の違いは何ですか?
A ==は値の等価性を比較するのに対し、isはパターンマッチングに使用され、変数を宣言する際に型をチェックすることができます(例:obj is string s)。
Q 条件演算子は、すべての if...else に置き換えることができますか?
A いいえ。条件演算子は、値を返すシナリオでのみ機能し、複数の文を含めることはできません。複雑なロジックには if...else を使用してください。

📖 まとめ

📝 練習問題

  1. 整数を入力し、それが正、負、またはゼロのいずれであるかを判定して、その結果を出力するプログラムを作成してください。
  2. switch式を使用して、月(1~12)をそれに対応する季節名に割り当てる
  3. オブジェクト変数を受け取り、isのパターンマッチングを用いてその型(int、string、またはその他)を判定し、型と値を出力するプログラムを作成してください。
  4. 条件演算子を使用して、数値の得点を文字評価に変換し(90以上はA、80以上はB、60以上はC、それ以外はD)、その読みやすさをif...else if構文を使ったバージョンと比較する
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%