if / else if / else(C#)
条件分岐の基本構文です。『if』で条件が真のときに実行するブロックを定義し、『else if』で追加条件を、『else』でいずれの条件にも該当しない場合の処理を記述します。『C#』では条件式に必ず bool 型を使わなければならず、整数をそのまま渡すことはできません。
構文
// 基本的なif文です。
if (条件式) {
// 条件式がtrueのときに実行されます。
}
// else if・elseを加えた構文です。
if (条件式1) {
// 条件式1がtrueのときに実行されます。
} else if (条件式2) {
// 条件式1がfalseで、条件式2がtrueのときに実行されます。
} else {
// すべての条件式がfalseのときに実行されます。
}
// ネストした条件分岐です。
if (条件式A) {
if (条件式B) {
// 条件式AとBがともにtrueのときに実行されます。
}
}
// 条件演算子(三項演算子)です。シンプルな値の選択に使います。
var 結果 = 条件式 ? 真のときの値 : 偽のときの値;
条件式で使う主な演算子
| 演算子 | 意味 | 例 |
|---|---|---|
| == | 等しい。 | hp == 0 |
| != | 等しくない。 | level != 1 |
| > | より大きい。 | score > 100 |
| >= | 以上。 | score >= 100 |
| < | より小さい。 | hp < 0 |
| <= | 以下。 | hp <= 0 |
| && | かつ(論理AND)。左辺がfalseなら右辺は評価されません(短絡評価)。 | hp > 0 && isAlive |
| || | または(論理OR)。左辺がtrueなら右辺は評価されません(短絡評価)。 | isActive || isElite |
| ! | 否定(論理NOT)。 | !isDisabled |
サンプルコード
IfElseBasic.cs
using System;
class IfElseBasic {
static void Main() {
// --- 基本的なif / else if / else ---
string name = "item_x";
int score = 850;
if (score >= 1000) {
Console.WriteLine(name + " は rank_S です。");
} else if (score >= 500) {
Console.WriteLine(name + " は rank_A です。"); // こちらが実行されます。
} else {
Console.WriteLine(name + " は rank_B です。");
}
// --- C#ではbool型のみ条件式に使えます ---
// int を直接渡すとコンパイルエラーになります。
// if (score) { } // ← エラー: 整数をboolに暗黙変換できません。
bool isActive = true;
if (isActive) {
Console.WriteLine(name + " は active です。"); // こちらが実行されます。
}
// --- ネストした条件分岐 ---
bool isActive2 = true;
bool hasOption = false;
if (isActive2) {
if (hasOption) {
Console.WriteLine(name + " はオプション有効です。");
} else {
Console.WriteLine(name + " は有効ですがオプションがありません。"); // こちらが実行されます。
}
} else {
Console.WriteLine(name + " は無効です。");
}
// --- early return パターン ---
// ガード節(guard clause)とも呼ばれます。
// 無効な値を先に弾くことでネストを浅くできます。
Console.WriteLine(GetStatusMessage("item_a", -1));
Console.WriteLine(GetStatusMessage("item_b", 15000));
Console.WriteLine(GetStatusMessage("item_c", 1500));
// --- 条件演算子(三項演算子)との使い分け ---
// 値を選ぶだけのシンプルなケースには条件演算子が読みやすくなります。
int hp = 0;
string status = hp > 0 ? "active" : "inactive";
Console.WriteLine("item_c の状態: " + status);
// 処理が複数行になる場合やネストする場合はif/elseの方が適しています。
}
// early returnでネストを回避したメソッドです。
static string GetStatusMessage(string name, int score) {
if (score < 0) {
return name + " のスコアが不正な値です。"; // 不正値を早期リターンで弾きます。
}
if (score >= 10000) {
return name + " は rank_S です。";
}
if (score >= 5000) {
return name + " は rank_A です。";
}
return name + " は rank_B です。";
}
}
コンパイルして実行すると次のようになります。
dotnet script IfElseBasic.cs item_x は rank_A です。 item_x は active です。 item_x は有効ですがオプションがありません。 item_a のスコアが不正な値です。 item_b は rank_S です。 item_c は rank_B です。 item_c の状態: inactive
よくあるミス
整数を条件式にそのまま渡す
C/C++ では if (count) のように整数を直接条件に書けますが、C# ではコンパイルエラーになります。C# の if には bool 型のみ渡せるため、必ず比較演算子を使って if (count != 0) のように書く必要があります。
int count = 5;
// コンパイルエラー: Cannot implicitly convert type 'int' to 'bool'
// if (count) { }
if (count != 0) {
Console.WriteLine("count は 0 ではありません。");
}
else if の条件の順序による到達不能コード
else if を並べる際、広い条件を先に書くと、より狭い条件に到達しなくなります。条件は狭い方から先に書いてください。
int score = 15000;
// 意図しない結果: score >= 500 が先に一致するため >= 1000 に到達しません。
if (score >= 500) {
Console.WriteLine("rank_A");
} else if (score >= 1000) {
Console.WriteLine("rank_S"); // ここには到達しません。
}
// 正しい順序: 狭い条件(>= 1000)を先に書きます。
if (score >= 1000) {
Console.WriteLine("rank_S");
} else if (score >= 500) {
Console.WriteLine("rank_A");
}
概要
『C#』では 条件式に使える型は bool(または bool?)のみです。Cや Java とは異なり、整数値 0 や 1 を直接 if に渡すとコンパイルエラーになります。if (count) のような書き方はできないため、必ず if (count != 0) のように比較式で bool を得てください。
値を選択するだけのシンプルな分岐には条件演算子(条件 ? 真 : 偽)が簡潔に書けます。ただし、処理が複数行になる場合やネストが深くなる場合は if / else の方が可読性が高くなります。無理に条件演算子を使おうとすると読みにくいコードになるため、場面に応じて使い分けてください。
ネストが深くなる場合は早期リターン(early return)を使って条件を先に弾く設計が読みやすいコードにつながります。多岐分岐には switch 文や switch 式も有効です。型による分岐は『is / as / パターンマッチ』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。