条件に応じて処理を分けるif文は、C#で最初に身につけたい基本文法のひとつです。
本稿では「もし〜ならA、でなければB」という最も基本的な形を中心に、比較・論理演算子の使い方、null・空文字の判定、else ifやネストの整理、三項演算子まで、初心者の方にも読みやすくサンプルコードを交えて丁寧に解説します。
C#のif文・elseの基本と条件分岐の書き方
if文の構文とブロック({})の書き方
if
は「条件がtrueならブロック内を実行」します。
ブロックは中括弧{}
で囲み、複数行の処理を安全にまとめます。
// 基本のif構文(トップレベル文;.NET 6以降)
int number = 7;
// 条件がtrueならブロック内が実行される
if (number % 2 == 1) // 奇数か?
{
Console.WriteLine("numberは奇数です");
}
Console.WriteLine("処理は続きます");
numberは奇数です
処理は続きます
elseの使い方:「もし〜ならA、でなければB」の基本形
else
はifの条件がfalseだったときの代替処理です。
「もし条件ならA、でなければB」を素直に書けます。
int score = 65;
if (score >= 70)
{
Console.WriteLine("合格です"); // A
}
else
{
Console.WriteLine("不合格です"); // B
}
不合格です
bool型と条件式の評価の仕組み
C#のif
条件は必ずbool
(true/false)に評価できる式である必要があります。
C言語のように0
や1
などの整数は条件に使えません。
また、条件式は左から右へ評価され、論理演算子&&
・||
は短絡評価(必要な範囲でのみ評価)を行います。
条件式の書き方と比較・論理演算子
比較演算子(==, !=, >, <, >=, <=)の使い方
代表的な比較演算子と意味を一覧にします。
演算子 | 読み方 | 例 | 結果 |
---|---|---|---|
== | 等しい | 3 == 3 | true |
!= | 等しくない | 3 != 4 | true |
> | より大きい | 5 > 2 | true |
< | より小さい | 2 < 5 | true |
>= | 以上 | 5 >= 5 | true |
<= | 以下 | 3 <= 2 | false |
文字列の==
は内容の等価比較(大文字小文字は区別)を行います。
用途によってはstring.Equals(a, b, StringComparison.OrdinalIgnoreCase)
のように比較方法を指定しましょう。
string a = "Hello";
string b = "hello";
if (a == b)
{
Console.WriteLine("== では一致");
}
else if (string.Equals(a, b, StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("大文字小文字を無視すれば一致");
}
else
{
Console.WriteLine("一致しません");
}
大文字小文字を無視すれば一致
論理演算子(&&, ||, !)で条件を組み合わせる
&&
(かつ):両方trueのときtrue。左がfalseなら右は評価しない(短絡)。||
(または):どちらかtrueでtrue。左がtrueなら右は評価しない(短絡)。!
(否定):trueとfalseを反転。
int age = 20;
bool hasTicket = true;
if (age >= 18 && hasTicket)
{
Console.WriteLine("入場できます");
}
bool isHoliday = false;
if (isHoliday || age < 12)
{
Console.WriteLine("割引が適用されます");
}
bool isMember = false;
if (!isMember)
{
Console.WriteLine("会員登録がおすすめです");
}
入場できます
割引が適用されます
会員登録がおすすめです
null/空文字の判定の注意点(string.IsNullOrEmpty など)
文字列の判定でnull
や空文字""
を区別せず扱いたい場合はstring.IsNullOrEmpty(s)
、空白のみ(スペースやタブ)も空として扱いたい場合はstring.IsNullOrWhiteSpace(s)
を使います。
string? name1 = null;
string name2 = "";
string name3 = " "; // 空白のみ
if (string.IsNullOrEmpty(name1)) Console.WriteLine("name1はnullまたは空");
if (string.IsNullOrEmpty(name2)) Console.WriteLine("name2はnullまたは空");
if (string.IsNullOrWhiteSpace(name3)) Console.WriteLine("name3は空白のみ");
// ダメな例:name.Length は null のとき例外になる
string? maybeNull = null;
// if (maybeNull.Length == 0) { ... } // NullReferenceException!
name1はnullまたは空
name2はnullまたは空
name3は空白のみ
サンプルコード集:if-elseで書く条件分岐
数値の範囲で分岐する例(年齢・スコア)
年齢で区分けするシンプルな例です。
int age = 68;
if (age < 13)
{
Console.WriteLine("子ども料金");
}
else if (age < 65) // 13〜64
{
Console.WriteLine("大人料金");
}
else // 65以上
{
Console.WriteLine("シニア料金");
}
シニア料金
試験スコアで合否と追試を判定する例です。
int score = 58;
if (score >= 70)
{
Console.WriteLine("合格");
}
else if (score >= 60) // 60〜69
{
Console.WriteLine("追試");
}
else
{
Console.WriteLine("不合格");
}
不合格
文字列入力のチェック例(空・空白の判定)
ユーザー名入力を確実にチェックします。
string? input = " "; // ユーザーからの入力を想定
if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("ユーザー名を入力してください");
}
else
{
Console.WriteLine($"ようこそ、{input}さん");
}
ユーザー名を入力してください
複合条件の例(フラグと値の組み合わせ)
会員フラグと購入金額で割引を振り分けます。
bool isMember = true;
decimal purchase = 12000m;
if (isMember && purchase >= 10000m)
{
Console.WriteLine("会員10%オフ適用");
}
else if (isMember && purchase >= 5000m)
{
Console.WriteLine("会員5%オフ適用");
}
else if (!isMember && purchase >= 10000m)
{
Console.WriteLine("非会員3%オフ適用");
}
else
{
Console.WriteLine("割引なし");
}
会員10%オフ適用
else ifとネストの使い分け
else ifで3つ以上の条件を順序よく書く
温度に応じてメッセージを変える例です。
上から順に特定→一般の順で条件を並べると読みやすくなります。
int temp = 31;
if (temp >= 35)
{
Console.WriteLine("危険な暑さです。外出を控えましょう");
}
else if (temp >= 30)
{
Console.WriteLine("非常に暑いです。こまめに水分補給を");
}
else if (temp >= 20)
{
Console.WriteLine("過ごしやすい気温です");
}
else
{
Console.WriteLine("肌寒いです。上着を持ちましょう");
}
非常に暑いです。こまめに水分補給を
深いネストを避けるコツ(ガード節・早期return)
条件が増えるとネストが深くなりがちです。
先に「例外的な条件」を弾くガード節でフラットにします。
// 悪い例:ネストが深い
string? email = "user@example.com";
bool consent = true;
if (email != null)
{
if (email.Contains("@"))
{
if (consent)
{
Console.WriteLine("登録処理を行います");
}
}
}
// 良い例:早期return(メソッド想定)でガード節を使う
void Register(string? mail, bool agreed)
{
if (string.IsNullOrWhiteSpace(mail)) { Console.WriteLine("メール未入力"); return; }
if (!mail.Contains("@")) { Console.WriteLine("メール形式エラー"); return; }
if (!agreed) { Console.WriteLine("利用規約に同意が必要です"); return; }
Console.WriteLine("登録処理を行います");
}
Register(email, false);
登録処理を行います
利用規約に同意が必要です
三項演算子(?:)で「AかBか」を1行で書く
三項演算子の基本構文と使いどき
「条件がtrueならA、falseならB」を値として選び、そのまま代入や出力に使えるのが三項演算子です。
短い条件分岐に向いています。
int age = 17;
string label = (age >= 18) ? "大人" : "未成年";
Console.WriteLine(label);
未成年
if-elseとの違いと可読性のベストプラクティス
三項演算子は「値を選ぶ」のに最適ですが、複数の処理や副作用を伴う場合はif-else
が読みやすいです。
入れ子の三項演算子は可読性が落ちるため避けます。
int score = 82;
// 短いラベル選択には三項演算子で十分
string grade = (score >= 90) ? "A" : (score >= 70) ? "B" : "C";
Console.WriteLine(grade);
// 複雑になり始めたら素直にif-elseへ
if (score >= 90)
{
Console.WriteLine("成績はA。表彰対象です");
}
else if (score >= 70)
{
Console.WriteLine("成績はB。よくできました");
}
else
{
Console.WriteLine("成績はC。復習しましょう");
}
B
成績はB。よくできました
よくあるエラー・注意点・まとめ
波かっこ({})省略によるバグを防ぐ
1行だけだからと中括弧を省略すると、行を追加した際に意図せずelse
が効かないなどのバグを招きます。
原則として常に{}
を付けるのがおすすめです。
int n = 5;
// 危険:将来行を足したときに誤動作しやすい
if (n > 0)
Console.WriteLine("正の数です"); // ここだけがifの対象
else
Console.WriteLine("正の数ではありません");
// 安全:常にブロックで囲む
if (n > 0)
{
Console.WriteLine("正の数です");
}
else
{
Console.WriteLine("正の数ではありません");
}
正の数です
正の数です
代入(=)と比較(==)の取り違えに注意
C#ではif (x = 1)
のような整数代入はコンパイルエラーになりますが、bool
変数への代入は通ってしまいます。
意図しない代入に注意しましょう。
bool flag = false;
// 悪い例:代入になってしまい、常にtrue
if (flag = true) // コンパイラは警告するが実行は可能
{
Console.WriteLine("常に実行されてしまう");
}
// 良い例:比較を使うか、そもそも比較を省略
flag = false;
if (flag == true)
{
Console.WriteLine("trueです");
}
else
{
Console.WriteLine("falseです");
}
// さらに良い:boolはそのまま評価
flag = false;
if (flag)
{
Console.WriteLine("trueです");
}
else
{
Console.WriteLine("falseです");
}
常に実行されてしまう
falseです
falseです
条件の順序と短絡評価で安全性と効率を上げる
&&
や||
は左から評価し、結果が確定すれば右側を評価しません。
これを活かして、例外や重い処理を避けましょう。
string? text = null;
// 良い順序:左でnullを弾くので右を評価しない(安全)
if (text != null && text.Length > 0)
{
Console.WriteLine("テキストあり");
}
// 悪い順序:先にLengthを見るとnullで例外になる
// if (text.Length > 0 && text != null) { ... } // 例外!
// 代替:null条件演算子や便利メソッドを活用
if (!string.IsNullOrEmpty(text))
{
Console.WriteLine("テキストあり");
}
// 重い判定は後ろに置く
bool HeavyCheck() { Console.WriteLine("重い処理..."); return true; }
bool quick = false;
if (quick && HeavyCheck()) // quickがfalseなのでHeavyCheckは呼ばれない
{
Console.WriteLine("両方true");
}
(何も出力されません)
まとめ
本稿では、C#におけるif文とelseの基本から、比較・論理演算子の使い方、null/空文字の安全な判定、実践的なサンプル、else ifとネストの整理方法、三項演算子の活用、そしてよくある落とし穴までを体系的に解説しました。
ポイントは次のとおりです。
条件式は必ずbool
で評価し、比較・論理演算子を正しく使い分けること。
string.IsNullOrEmpty
やIsNullOrWhiteSpace
で入力の堅牢性を上げること。
else if
で順序を意識しつつ、ガード節でネストを浅く保つこと。
短い分岐は三項演算子、複雑な処理はif-else
で読みやすく。
最後に、中括弧の省略や=
と==
の取り違え、短絡評価の順序には常に注意しましょう。
これらを意識すれば、「もし〜ならA、でなければB」を起点に、堅牢で読みやすい条件分岐が書けるようになります。