C#の判定処理を完全解説|if文・nullチェック・型判定・三項演算子の使い分け入門

はじめに

C#でプログラムを書くとき、ほぼ必ず登場するのが「判定処理」です。

たとえば、次のような処理はすべて判定処理です。

C#
if (age >= 20)
{
Console.WriteLine("成人です");
}

「年齢が20以上なら成人と表示する」「文字列が空ならエラーにする」「値がnullでなければ処理を続ける」といったように、条件によって処理を分ける場面は非常に多くあります。

C#の判定処理には、if文、switch文、三項演算子、nullチェック、型判定、パターンマッチングなど、さまざまな書き方があります。

この記事では、C#の判定処理について、初心者にもわかりやすく基本から実務でよく使うパターンまで解説します。

1. C#の判定処理とは?まず押さえる基本

1-1. 判定処理とは「条件によって処理を分ける」書き方

判定処理とは、ある条件が成り立つかどうかによって、実行する処理を変える書き方です。

たとえば、ログイン画面で「パスワードが正しい場合だけログインを許可する」という処理は、典型的な判定処理です。

C#
if (password == "secret")
{
Console.WriteLine("ログイン成功");
}
else
{
Console.WriteLine("ログイン失敗");
}

この例では、password == "secret" が条件式です。

条件式の結果が true の場合は if ブロック内の処理が実行され、false の場合は else ブロック内の処理が実行されます。

C#では、このような条件分岐を使うことで、ユーザー入力、データの状態、処理結果などに応じて柔軟にプログラムを動かせます。

1-2. C#でよく使う判定処理の種類一覧

C#でよく使う判定処理には、主に次のようなものがあります。

C#
// if文
if (score >= 80)
{
Console.WriteLine("合格");
}

// 三項演算子
string result = score >= 80 ? "合格" : "不合格";

// switch文
switch (status)
{
case 1:
Console.WriteLine("処理中");
break;
case 2:
Console.WriteLine("完了");
break;
}

// nullチェック
if (name is not null)
{
Console.WriteLine(name);
}

// 型判定
if (obj is string text)
{
Console.WriteLine(text.Length);
}

基本的には、複雑な処理の分岐には if文、値によって処理を分ける場合には switch、単純な値の切り替えには 三項演算子、nullを扱う場合には is null??、型を調べる場合には is を使うことが多いです。

1-3. true/falseを返す条件式の考え方

C#の判定処理では、条件式は最終的に true または false を返します。

C#
int age = 25;

bool isAdult = age >= 20;

Console.WriteLine(isAdult); // True

age >= 20 は、「ageが20以上かどうか」を判定する式です。

結果は true または false になります。

if文では、このようなbool値を使って処理を分けます。

C#
if (isAdult)
{
Console.WriteLine("成人です");
}

また、条件式を直接if文に書くこともできます。

C#
if (age >= 20)
{
Console.WriteLine("成人です");
}

C#の判定処理を理解するうえで、「条件式はbool値になる」という考え方は非常に重要です。

1-4. 初心者がつまずきやすい「=」と「==」の違い

C#初心者がよく間違えるのが、=== の違いです。

= は代入です。

C#
int age = 20;

これは「ageに20を入れる」という意味です。

一方、== は比較です。

C#
if (age == 20)
{
Console.WriteLine("20歳です");
}

これは「ageが20と等しいかどうか」を判定しています。

つまり、役割はまったく異なります。

C#
// 代入
age = 30;

// 比較
age == 30;

C#のif文では条件式にbool型が必要です。そのため、数値に対して if (age = 20) のように書くと、基本的にはエラーになります。

正しくは次のように書きます。

C#
if (age == 20)
{
Console.WriteLine("20歳です");
}

「代入は =、比較は ==」と覚えておきましょう。

2. if文による基本的な判定処理

2-1. if文の基本構文

C#のif文は、条件がtrueの場合だけ処理を実行したいときに使います。

C#
if (条件式)
{
条件がtrueの場合に実行する処理
}

具体例を見てみましょう。

C#
int score = 85;

if (score >= 80)
{
Console.WriteLine("合格です");
}

この例では、score >= 80 がtrueなので、合格です と表示されます。

if文では、条件式を丸かっこ () の中に書き、実行したい処理を波かっこ {} の中に書きます。

1行だけの処理であれば波かっこを省略することもできますが、初心者のうちは省略しない方が安全です。

C#
if (score >= 80)
Console.WriteLine("合格です");

上記のようにも書けますが、処理を追加したときにミスが起きやすいため、基本的には波かっこを付ける書き方がおすすめです。

2-2. if〜elseで条件に応じて処理を分ける

条件がtrueの場合とfalseの場合で処理を分けたいときは、else を使います。

C#
int score = 60;

if (score >= 80)
{
Console.WriteLine("合格です");
}
else
{
Console.WriteLine("不合格です");
}

この場合、score >= 80 はfalseなので、else 側の処理が実行されます。

if〜else は、「条件を満たす場合」と「満たさない場合」を明確に分けられるため、非常によく使われます。

C#
bool isLoggedIn = false;

if (isLoggedIn)
{
Console.WriteLine("マイページを表示します");
}
else
{
Console.WriteLine("ログインしてください");
}

ログイン状態、入力チェック、権限チェックなど、実務でも頻繁に登場する書き方です。

2-3. else ifで複数条件を判定する

条件が複数ある場合は、else if を使います。

C#
int score = 75;

if (score >= 90)
{
Console.WriteLine("評価:A");
}
else if (score >= 70)
{
Console.WriteLine("評価:B");
}
else if (score >= 50)
{
Console.WriteLine("評価:C");
}
else
{
Console.WriteLine("評価:D");
}

この例では、scoreが75なので、score >= 70 の条件に一致し、評価:B が表示されます。

else if は上から順番に判定され、最初にtrueになったブロックだけが実行されます。

そのため、条件の順番が重要です。

C#
int score = 95;

if (score >= 50)
{
Console.WriteLine("C以上");
}
else if (score >= 90)
{
Console.WriteLine("A");
}

この書き方では、scoreが95でも最初の score >= 50 がtrueになるため、score >= 90 には到達しません。

範囲の大きい条件や優先度の高い条件から順番に書くことが大切です。

2-4. 複数条件を組み合わせる「&&」「||」「!」

C#では、複数の条件を組み合わせて判定できます。

&& は「かつ」を意味します。

C#
int age = 25;
bool hasLicense = true;

if (age >= 18 && hasLicense)
{
Console.WriteLine("運転できます");
}

この場合、age >= 18hasLicense の両方がtrueの場合だけ処理が実行されます。

|| は「または」を意味します。

C#
bool isAdmin = false;
bool isOwner = true;

if (isAdmin || isOwner)
{
Console.WriteLine("編集できます");
}

この場合、isAdmin または isOwner のどちらかがtrueであれば処理が実行されます。

! は「否定」を意味します。

C#
bool isDeleted = false;

if (!isDeleted)
{
Console.WriteLine("表示対象です");
}

!isDeleted は「削除されていない場合」という意味になります。

複数条件を使うときは、丸かっこを使って意図を明確にすると読みやすくなります。

C#
if ((age >= 18 && hasLicense) || isAdmin)
{
Console.WriteLine("操作できます");
}

2-5. if文を書くときの可読性を高めるコツ

if文は便利ですが、条件が複雑になると読みにくくなります。

たとえば、次のようなコードは理解しにくくなりがちです。

C#
if (user != null && user.IsActive && user.Age >= 20 && !user.IsDeleted)
{
Console.WriteLine("対象ユーザーです");
}

条件が多い場合は、意味のある変数に分けると読みやすくなります。

C#
bool isTargetUser =
user != null &&
user.IsActive &&
user.Age >= 20 &&
!user.IsDeleted;

if (isTargetUser)
{
Console.WriteLine("対象ユーザーです");
}

また、早期リターンを使うとネストを浅くできます。

C#
void Process(User? user)
{
if (user is null)
{
return;
}

if (!user.IsActive)
{
return;
}

Console.WriteLine("処理を実行します");
}

if文を書くときは、単に動けばよいのではなく、後から読んだ人が理解しやすいかも意識しましょう。

3. C#で値を比較・判定する方法

3-1. 数値を比較する判定

数値の判定では、比較演算子を使います。

C#
int value = 10;

if (value == 10)
{
Console.WriteLine("10です");
}

if (value != 0)
{
Console.WriteLine("0ではありません");
}

if (value > 5)
{
Console.WriteLine("5より大きいです");
}

if (value >= 10)
{
Console.WriteLine("10以上です");
}

if (value < 20)
{
Console.WriteLine("20より小さいです");
}

if (value <= 10)
{
Console.WriteLine("10以下です");
}

よく使う比較演算子は次の通りです。

演算子意味
==等しい
!=等しくない
>より大きい
>=以上
<より小さい
<=以下

範囲を判定する場合は、&& を使います。

C#
int age = 30;

if (age >= 20 && age < 65)
{
Console.WriteLine("成人かつ高齢者ではありません");
}

C#では、数学のように 20 <= age < 65 とは書けません。

正しくは次のように書きます。

C#
if (20 <= age && age < 65)
{
Console.WriteLine("範囲内です");
}

3-2. 文字列が一致するか判定する

文字列が一致するかどうかは、== または Equals を使って判定できます。

C#
string name = "Taro";

if (name == "Taro")
{
Console.WriteLine("名前はTaroです");
}

Equals を使うこともできます。

C#
if (name.Equals("Taro"))
{
Console.WriteLine("名前はTaroです");
}

ただし、name がnullの可能性がある場合は注意が必要です。

C#
string? name = null;

// NullReferenceExceptionになる可能性がある
if (name.Equals("Taro"))
{
Console.WriteLine("一致しました");
}

安全に書くなら、比較対象の文字列を左側に置く方法があります。

C#
if ("Taro".Equals(name))
{
Console.WriteLine("一致しました");
}

または、string.Equals を使うとnullにも対応しやすくなります。

C#
if (string.Equals(name, "Taro"))
{
Console.WriteLine("一致しました");
}

3-3. 大文字・小文字を区別せずに文字列判定する

大文字・小文字を区別せずに比較したい場合は、StringComparison を指定します。

C#
string input = "apple";

if (string.Equals(input, "APPLE", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("一致しました");
}

この例では、appleAPPLE を同じ文字列として判定します。

実務では、ユーザー入力、コード値、URL、メールアドレスなどを比較するときに、大文字・小文字を区別しない判定が必要になることがあります。

次のように ToLower()ToUpper() を使って比較することもできますが、基本的には StringComparison を指定する方法が読みやすく、意図も明確です。

C#
if (input.ToLower() == "apple")
{
Console.WriteLine("一致しました");
}

おすすめは次の書き方です。

C#
if (string.Equals(input, "apple", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("一致しました");
}

3-4. 空文字や空白を判定する

文字列が空かどうかを判定する場合は、string.IsNullOrEmpty を使います。

C#
string? name = "";

if (string.IsNullOrEmpty(name))
{
Console.WriteLine("未入力です");
}

string.IsNullOrEmpty は、値がnullまたは空文字 "" の場合にtrueを返します。

空白だけの文字列も未入力として扱いたい場合は、string.IsNullOrWhiteSpace を使います。

C#
string? name = "   ";

if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("未入力です");
}

IsNullOrWhiteSpace は、null、空文字、半角スペース、タブ、改行なども空として判定します。

入力チェックでは、基本的に string.IsNullOrWhiteSpace を使う場面が多いです。

C#
if (string.IsNullOrWhiteSpace(userName))
{
Console.WriteLine("ユーザー名を入力してください");
}

3-5. コレクションの件数や存在有無を判定する

配列やリストなどのコレクションでは、件数や要素の有無を判定することがよくあります。

C#
List<string> names = new List<string> { "Taro", "Hanako" };

if (names.Count > 0)
{
Console.WriteLine("要素があります");
}

LINQを使える場合は、Any() を使うと「1件でも存在するか」を自然に表現できます。

C#
if (names.Any())
{
Console.WriteLine("要素があります");
}

特定の条件に一致する要素があるか判定することもできます。

C#
if (names.Any(name => name == "Taro"))
{
Console.WriteLine("Taroが存在します");
}

リスト自体がnullの可能性がある場合は、nullチェックも必要です。

C#
List<string>? names = null;

if (names is not null && names.Any())
{
Console.WriteLine("要素があります");
}

またはnull条件演算子を使って、次のように書けます。

C#
if (names?.Any() == true)
{
Console.WriteLine("要素があります");
}

names?.Any() は、namesがnullの場合にnullを返します。そのため、== true を付けることで「nullではなく、かつ要素がある場合」を判定できます。

4. C#のnullチェックを正しく理解する

4-1. nullとは何か

null とは、「値が存在しない」ことを表す特別な値です。

C#
string? name = null;

この例では、nameには文字列が入っていません。

nullの値に対してメソッドやプロパティを呼び出すと、NullReferenceException が発生する可能性があります。

C#
string? name = null;

Console.WriteLine(name.Length); // エラーになる

このようなエラーを防ぐために、C#ではnullチェックが重要です。

C#
if (name is not null)
{
Console.WriteLine(name.Length);
}

nullを扱うときは、「その変数に値が入っている前提で処理してよいか」を必ず考える必要があります。

4-2. 「== null」「!= null」による基本的なnull判定

もっとも基本的なnull判定は、== null!= null です。

C#
string? name = null;

if (name == null)
{
Console.WriteLine("nameはnullです");
}

nullでないことを判定する場合は、!= null を使います。

C#
if (name != null)
{
Console.WriteLine(name.Length);
}

この書き方はシンプルで、多くのC#コードで使われています。

ただし、C#では後述する is nullis not null もよく使われます。

C#
if (name is null)
{
Console.WriteLine("nameはnullです");
}

if (name is not null)
{
Console.WriteLine(name.Length);
}

どちらもnullチェックとして使えますが、近年のC#では is null / is not null を好むケースも増えています。

4-3. 「is null」「is not null」によるnull判定

is null は、値がnullかどうかを判定する書き方です。

C#
string? name = null;

if (name is null)
{
Console.WriteLine("nullです");
}

nullでないことを判定する場合は、is not null を使います。

C#
if (name is not null)
{
Console.WriteLine(name.Length);
}

is not null は読みやすく、「nullではない」という意味がそのまま表現できます。

また、パターンマッチングとの相性もよいです。

C#
object? value = "Hello";

if (value is string text)
{
Console.WriteLine(text.Length);
}

このように、is はnull判定だけでなく、型判定にも使われます。

nullチェックでは、次のように使い分けるとわかりやすいです。

C#
if (user is null)
{
return;
}

Console.WriteLine(user.Name);

早期リターンと組み合わせることで、nullの場合の処理を先に終わらせ、その後のコードを読みやすくできます。

4-4. null合体演算子「??」で初期値を返す

nullの場合に代わりの値を使いたいときは、null合体演算子 ?? を使います。

C#
string? name = null;

string displayName = name ?? "ゲスト";

Console.WriteLine(displayName); // ゲスト

name ?? "ゲスト" は、「nameがnullでなければnameを使い、nullなら"ゲスト"を使う」という意味です。

if文で書くと次のようになります。

C#
string displayName;

if (name != null)
{
displayName = name;
}
else
{
displayName = "ゲスト";
}

?? を使うと、null時の初期値を短く書けます。

設定値や表示名、オプション値の初期化でよく使われます。

C#
string message = inputMessage ?? "メッセージはありません";

また、null合体代入演算子 ??= を使うと、nullの場合だけ値を代入できます。

C#
name ??= "ゲスト";

これは次の処理と同じ意味です。

C#
if (name == null)
{
name = "ゲスト";
}

4-5. null条件演算子「?.」でNullReferenceExceptionを防ぐ

null条件演算子 ?. を使うと、対象がnullでない場合だけメンバーにアクセスできます。

C#
string? name = null;

int? length = name?.Length;

Console.WriteLine(length); // null

通常、name.Length と書くと、nameがnullの場合に NullReferenceException が発生します。

しかし、name?.Length と書くと、nameがnullの場合は例外にならず、結果がnullになります。

オブジェクトのプロパティアクセスにも使えます。

C#
User? user = null;

string? userName = user?.Name;

メソッド呼び出しにも使えます。

C#
user?.SendMessage();

この場合、userがnullでなければ SendMessage() が実行され、nullであれば何も実行されません。

null条件演算子は便利ですが、nullを握りつぶしてよい場面かどうかは考える必要があります。

エラーとして扱うべきnullまで無視してしまうと、不具合の原因が見つけにくくなることがあります。

4-6. Nullable型「int?」「bool?」の判定方法

C#では、値型である intbool は通常nullを持てません。

C#
int age = null; // エラー

しかし、int? のように書くとnullを許可できます。

C#
int? age = null;

これをNullable型と呼びます。

Nullable型に値があるかどうかは、HasValue で判定できます。

C#
int? age = 20;

if (age.HasValue)
{
Console.WriteLine(age.Value);
}

Value を使うと中身の値を取り出せますが、nullのときに Value を呼ぶとエラーになります。

そのため、必ず HasValue で確認してから使います。

C#
if (age.HasValue)
{
Console.WriteLine(age.Value);
}
else
{
Console.WriteLine("年齢は未設定です");
}

また、null合体演算子を使って初期値を設定することもできます。

C#
int displayAge = age ?? 0;

bool? の場合は、true、false、nullの3状態を持ちます。

C#
bool? isApproved = null;

if (isApproved == true)
{
Console.WriteLine("承認済み");
}
else if (isApproved == false)
{
Console.WriteLine("未承認");
}
else
{
Console.WriteLine("未設定");
}

bool? は通常のboolとは違い、null状態があるため、判定時には注意が必要です。

4-7. nullチェックでよくあるエラーと対策

nullチェックでよくあるエラーは、nullの可能性がある値に対して、そのままプロパティやメソッドを呼び出してしまうことです。

C#
string? name = null;

Console.WriteLine(name.Length); // エラー

対策として、事前にnullチェックを行います。

C#
if (name is not null)
{
Console.WriteLine(name.Length);
}

または、null条件演算子を使います。

C#
Console.WriteLine(name?.Length);

nullの場合に初期値を使いたいなら、?? を使います。

C#
int length = name?.Length ?? 0;

このコードは、「nameがnullでなければLengthを使い、nullなら0を使う」という意味です。

実務では、次のように用途に応じて使い分けるのが重要です。

C#
// nullなら処理を中断する
if (user is null)
{
return;
}

// nullなら初期値を使う
string name = user.Name ?? "未設定";

// nullなら何もしない
user.Profile?.Update();

nullチェックは単なるエラー回避ではなく、「nullの場合にどう扱うべきか」を明確にするための処理です。

5. 型判定の使い方|is・as・typeof・GetType

5-1. is演算子で型を判定する

C#でオブジェクトの型を判定するには、is 演算子を使います。

C#
object value = "Hello";

if (value is string)
{
Console.WriteLine("文字列です");
}

value is string は、「valueがstring型かどうか」を判定します。

is は、指定した型に変換できる場合にtrueを返します。

C#
object number = 123;

if (number is int)
{
Console.WriteLine("int型です");
}

型によって処理を変えたい場合に便利です。

C#
void PrintValue(object value)
{
if (value is string)
{
Console.WriteLine("文字列です");
}
else if (value is int)
{
Console.WriteLine("整数です");
}
}

ただし、型判定だけをして、その後に別途キャストする書き方は冗長になりやすいです。

C#
if (value is string)
{
string text = (string)value;
Console.WriteLine(text.Length);
}

このような場合は、次のパターンマッチングを使うとより自然です。

5-2. パターンマッチングで判定と代入を同時に行う

C#では、is を使って型判定と変数への代入を同時に行えます。

C#
object value = "Hello";

if (value is string text)
{
Console.WriteLine(text.Length);
}

このコードでは、valueがstring型であれば、string型の変数 text として使えます。

従来の書き方と比べると、かなり簡潔です。

C#
if (value is string)
{
string text = (string)value;
Console.WriteLine(text.Length);
}

パターンマッチングを使うと、型判定とキャストを一度に書けるため、安全で読みやすいコードになります。

条件を追加することもできます。

C#
if (value is string text && text.Length > 0)
{
Console.WriteLine("空でない文字列です");
}

プロパティパターンを使うと、オブジェクトの状態も同時に判定できます。

C#
if (user is { IsActive: true })
{
Console.WriteLine("有効なユーザーです");
}

C#の型判定では、まず is 型 変数名 の形を覚えるとよいでしょう。

5-3. as演算子で安全にキャストする

as 演算子は、指定した型へのキャストを試み、失敗した場合はnullを返します。

C#
object value = "Hello";

string? text = value as string;

if (text is not null)
{
Console.WriteLine(text.Length);
}

通常のキャストでは、型が合わない場合に例外が発生します。

C#
object value = 123;

string text = (string)value; // エラー

一方、as を使うと、キャストできない場合はnullになります。

C#
string? text = value as string;

if (text is null)
{
Console.WriteLine("stringに変換できません");
}

ただし、現在のC#では、型判定とキャストを同時に行うなら is string text の方が使いやすい場面が多いです。

C#
if (value is string text)
{
Console.WriteLine(text.Length);
}

as は、キャスト後の値を後続処理で使いたい場合や、nullチェックと組み合わせたい場合に使われます。

5-4. typeofとGetTypeの違い

typeofGetType() は、どちらも型情報を扱うために使いますが、役割が異なります。

typeof は、コード上で指定した型の情報を取得します。

C#
Type type = typeof(string);

Console.WriteLine(type.Name); // String

一方、GetType() は、実行時のインスタンスの型を取得します。

C#
object value = "Hello";

Type type = value.GetType();

Console.WriteLine(type.Name); // String

違いを整理すると、次のようになります。

C#
string text = "Hello";

Console.WriteLine(typeof(string)); // System.String
Console.WriteLine(text.GetType()); // System.String

typeof は型そのものに対して使い、GetType() はインスタンスに対して使います。

注意点として、GetType() は対象がnullの場合に呼び出すとエラーになります。

C#
string? text = null;

// text.GetType(); // エラー

そのため、nullの可能性がある場合は事前にnullチェックが必要です。

C#
if (text is not null)
{
Console.WriteLine(text.GetType());
}

5-5. 継承・インターフェースを含む型判定の注意点

is は、継承関係やインターフェースの実装も考慮して判定します。

C#
class Animal { }
class Dog : Animal { }

Animal animal = new Dog();

if (animal is Dog)
{
Console.WriteLine("Dog型です");
}

if (animal is Animal)
{
Console.WriteLine("Animal型です");
}

この例では、animalの実体はDogなので、animal is Dog はtrueです。

また、DogはAnimalを継承しているため、animal is Animal もtrueです。

インターフェースでも同様です。

C#
interface IRunnable
{
void Run();
}

class Dog : IRunnable
{
public void Run()
{
Console.WriteLine("走ります");
}
}

object obj = new Dog();

if (obj is IRunnable runnable)
{
runnable.Run();
}

is は「完全にその型か」ではなく、「その型として扱えるか」を判定します。

完全に同じ型かどうかを判定したい場合は、GetType() を使います。

C#
if (animal.GetType() == typeof(Dog))
{
Console.WriteLine("実体はDog型です");
}

継承やインターフェースを含む場合は、isGetType() の違いを理解して使い分けましょう。

5-6. 型判定後に安全に処理する実践例

実務では、object型で受け取った値を型ごとに処理したい場面があります。

C#
void Print(object? value)
{
if (value is null)
{
Console.WriteLine("nullです");
}
else if (value is string text)
{
Console.WriteLine($"文字列:{text}");
}
else if (value is int number)
{
Console.WriteLine($"整数:{number}");
}
else
{
Console.WriteLine("未対応の型です");
}
}

このように書くと、null、文字列、整数、それ以外を安全に判定できます。

switch式を使って書くこともできます。

C#
string GetMessage(object? value)
{
return value switch
{
null => "nullです",
string text => $"文字列:{text}",
int number => $"整数:{number}",
_ => "未対応の型です"
};
}

型判定では、判定後に安全にその型として扱えることが重要です。

そのため、次のような書き方は避けた方がよいです。

C#
if (value is string)
{
Console.WriteLine(((string)value).Length);
}

おすすめは、パターンマッチングを使う書き方です。

C#
if (value is string text)
{
Console.WriteLine(text.Length);
}

6. 三項演算子で判定処理を短く書く

6-1. 三項演算子「条件 ? true時 : false時」の基本

三項演算子は、条件に応じて値を切り替えるための書き方です。

C#
条件 ? trueの場合の値 : falseの場合の値

具体例を見てみましょう。

C#
int score = 80;

string result = score >= 60 ? "合格" : "不合格";

Console.WriteLine(result);

このコードでは、score >= 60 がtrueなら "合格"、falseなら "不合格" がresultに代入されます。

if文で書くと次のようになります。

C#
string result;

if (score >= 60)
{
result = "合格";
}
else
{
result = "不合格";
}

三項演算子を使うと、単純な条件による値の切り替えを短く書けます。

6-2. if文と三項演算子の書き換え例

次のif文を見てください。

C#
int age = 20;
string message;

if (age >= 20)
{
message = "成人";
}
else
{
message = "未成年";
}

これは三項演算子で次のように書けます。

C#
string message = age >= 20 ? "成人" : "未成年";

bool値を返す処理でも使えます。

C#
bool canEnter = age >= 18 ? true : false;

ただし、この書き方は冗長です。

条件式自体がboolを返すため、次のように書けます。

C#
bool canEnter = age >= 18;

三項演算子は便利ですが、何でも三項演算子にすればよいわけではありません。

「条件によって値を選ぶ」場面で使うと読みやすくなります。

6-3. 三項演算子を使うべき場面

三項演算子は、次のような単純な値の切り替えに向いています。

C#
string label = isActive ? "有効" : "無効";

表示文字列を切り替える場面でもよく使います。

C#
string buttonText = isEditMode ? "更新" : "登録";

数値を切り替えることもできます。

C#
int discountRate = isMember ? 10 : 0;

三項演算子を使うべき場面は、条件が短く、trueの場合とfalseの場合の値がひと目でわかるときです。

C#
string statusText = status == 1 ? "処理中" : "未処理";

このような単純な条件であれば、if文よりも三項演算子の方が簡潔になります。

6-4. 三項演算子を使わない方がよい場面

三項演算子は、複雑な条件や処理には向いていません。

C#
string result = score >= 90 ? "A" : score >= 70 ? "B" : score >= 50 ? "C" : "D";

このように三項演算子を入れ子にすると、読みにくくなります。

この場合は、if文やswitch式を使った方がわかりやすいです。

C#
string result;

if (score >= 90)
{
result = "A";
}
else if (score >= 70)
{
result = "B";
}
else if (score >= 50)
{
result = "C";
}
else
{
result = "D";
}

また、複数行の処理をしたい場合も三項演算子には向いていません。

C#
if (isValid)
{
Save();
SendMail();
}
else
{
ShowError();
}

このような処理は、if文で明確に書くべきです。

三項演算子は「処理を分ける」よりも「値を選ぶ」ための構文と考えると使い分けやすくなります。

6-5. null合体演算子との違い

三項演算子とnull合体演算子 ?? は似て見えますが、役割が異なります。

三項演算子は、任意の条件で値を切り替えます。

C#
string message = age >= 20 ? "成人" : "未成年";

一方、null合体演算子は、値がnullかどうかだけを判定します。

C#
string displayName = name ?? "ゲスト";

これは三項演算子で書くと次のようになります。

C#
string displayName = name != null ? name : "ゲスト";

nullの場合だけ初期値を使いたいなら、?? の方が簡潔です。

C#
string title = inputTitle ?? "無題";

条件がnull判定以外の場合は、三項演算子を使います。

C#
string title = inputTitle.Length > 10 ? "長いタイトル" : "短いタイトル";

使い分けのポイントは、「nullかどうかだけを見るなら ??」「自由な条件で値を切り替えるなら三項演算子」です。

7. switch文・switch式による複数条件の判定

7-1. switch文の基本構文

switch 文は、1つの値に対して複数の候補を判定したいときに使います。

C#
int status = 1;

switch (status)
{
case 0:
Console.WriteLine("未処理");
break;
case 1:
Console.WriteLine("処理中");
break;
case 2:
Console.WriteLine("完了");
break;
default:
Console.WriteLine("不明");
break;
}

switch は、statusの値に一致する case を探して実行します。

どのcaseにも一致しない場合は、default が実行されます。

複数の固定値によって処理を分ける場合は、if文よりもswitch文の方が読みやすくなることがあります。

C#
string role = "Admin";

switch (role)
{
case "Admin":
Console.WriteLine("管理者です");
break;
case "User":
Console.WriteLine("一般ユーザーです");
break;
default:
Console.WriteLine("権限不明です");
break;
}

7-2. switch式で値を返す判定を書く

switch式を使うと、条件に応じて値を返す処理を簡潔に書けます。

C#
int status = 1;

string message = status switch
{
0 => "未処理",
1 => "処理中",
2 => "完了",
_ => "不明"
};

_ は、どの条件にも一致しない場合を表します。

switch文と比べると、値を返す処理が非常にすっきりします。

if文で書くと次のようになります。

C#
string message;

if (status == 0)
{
message = "未処理";
}
else if (status == 1)
{
message = "処理中";
}
else if (status == 2)
{
message = "完了";
}
else
{
message = "不明";
}

単純な値の変換には、switch式が便利です。

C#
string GetStatusText(int status)
{
return status switch
{
0 => "未処理",
1 => "処理中",
2 => "完了",
_ => "不明"
};
}

7-3. パターンマッチングと組み合わせた判定

switch式は、パターンマッチングと組み合わせることで、型や条件を柔軟に判定できます。

C#
object? value = "Hello";

string message = value switch
{
null => "nullです",
string text => $"文字列です:{text}",
int number => $"整数です:{number}",
_ => "その他の型です"
};

型ごとの処理を整理したい場合に便利です。

条件を追加することもできます。

C#
int score = 85;

string grade = score switch
{
>= 90 => "A",
>= 70 => "B",
>= 50 => "C",
_ => "D"
};

このように、数値の範囲判定にも使えます。

オブジェクトのプロパティを判定することもできます。

C#
string result = user switch
{
null => "ユーザーなし",
{ IsActive: true } => "有効ユーザー",
{ IsActive: false } => "無効ユーザー"
};

switch式は、複数の判定を「値を返す処理」として整理したいときに役立ちます。

7-4. if文とswitchの使い分け

if文とswitchは、どちらも条件分岐に使えますが、向いている場面が異なります。

if文は、自由な条件式に向いています。

C#
if (age >= 20 && hasLicense)
{
Console.WriteLine("運転できます");
}

複数の条件を組み合わせる場合や、範囲、nullチェック、複雑なロジックを扱う場合はif文が自然です。

一方、switchは、1つの値に対して複数の候補を判定する場合に向いています。

C#
switch (status)
{
case 0:
Console.WriteLine("未処理");
break;
case 1:
Console.WriteLine("処理中");
break;
case 2:
Console.WriteLine("完了");
break;
}

値を返すだけなら、switch式も便利です。

C#
string text = status switch
{
0 => "未処理",
1 => "処理中",
2 => "完了",
_ => "不明"
};

複雑な条件はif文、固定値の分岐はswitch、値の変換はswitch式と考えると使い分けやすくなります。

7-5. 複雑な条件分岐を整理するコツ

条件分岐が複雑になった場合は、まず条件を意味のある名前に分けることが大切です。

C#
bool canPurchase =
user is not null &&
user.IsActive &&
user.Age >= 20 &&
product.Stock > 0;

if (canPurchase)
{
Console.WriteLine("購入できます");
}

また、条件ごとにメソッド化するのも効果的です。

C#
bool CanPurchase(User user, Product product)
{
return user.IsActive && user.Age >= 20 && product.Stock > 0;
}

呼び出し側はシンプルになります。

C#
if (CanPurchase(user, product))
{
Console.WriteLine("購入できます");
}

複数の固定値を扱うならswitch式で整理できます。

C#
string GetStatusText(OrderStatus status)
{
return status switch
{
OrderStatus.Pending => "未処理",
OrderStatus.Processing => "処理中",
OrderStatus.Completed => "完了",
_ => "不明"
};
}

条件分岐は、増えるほど保守が難しくなります。

「条件に名前を付ける」「メソッドに分ける」「switch式で値変換をまとめる」といった工夫で、読みやすいコードにしましょう。

8. 実務でよく使うC#判定処理のパターン

8-1. 入力値が未入力か判定する

ユーザー入力が未入力かどうかを判定する場合は、string.IsNullOrWhiteSpace を使うのが基本です。

C#
string? userName = " ";

if (string.IsNullOrWhiteSpace(userName))
{
Console.WriteLine("ユーザー名を入力してください");
}

空文字だけでなく、スペースだけの入力も未入力として扱えます。

メールアドレスやパスワードなどの入力チェックでもよく使います。

C#
if (string.IsNullOrWhiteSpace(email))
{
Console.WriteLine("メールアドレスを入力してください");
}

複数の入力項目をチェックする場合は、早期リターンを使うと読みやすくなります。

C#
void Register(string? name, string? email)
{
if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("名前を入力してください");
return;
}

if (string.IsNullOrWhiteSpace(email))
{
Console.WriteLine("メールアドレスを入力してください");
return;
}

Console.WriteLine("登録します");
}

入力チェックでは、「null」「空文字」「空白だけ」をまとめて判定できる書き方を選ぶことが重要です。

8-2. 数値が範囲内か判定する

数値が範囲内かどうかを判定するには、比較演算子と && を使います。

C#
int score = 75;

if (score >= 0 && score <= 100)
{
Console.WriteLine("有効な点数です");
}
else
{
Console.WriteLine("点数が範囲外です");
}

年齢の範囲判定も同じです。

C#
int age = 30;

if (age >= 20 && age < 65)
{
Console.WriteLine("対象年齢です");
}

C#では、次のような数学的な連続比較はできません。

C#
// if (0 <= score <= 100) // C#では不可

正しくは、条件を分けて書きます。

C#
if (0 <= score && score <= 100)
{
Console.WriteLine("範囲内です");
}

範囲判定は、入力値の検証、価格チェック、在庫数チェック、ページ番号の確認など、さまざまな場面で使われます。

8-3. 日付が過去・未来か判定する

日付を判定する場合は、DateTime を比較します。

C#
DateTime targetDate = new DateTime(2026, 1, 1);

if (targetDate < DateTime.Today)
{
Console.WriteLine("過去の日付です");
}
else if (targetDate > DateTime.Today)
{
Console.WriteLine("未来の日付です");
}
else
{
Console.WriteLine("今日です");
}

現在時刻まで含めて比較したい場合は、DateTime.Now を使います。

C#
DateTime deadline = new DateTime(2026, 1, 1, 18, 0, 0);

if (deadline < DateTime.Now)
{
Console.WriteLine("期限切れです");
}

日付だけを比較したい場合は、Date プロパティを使います。

C#
if (targetDate.Date == DateTime.Today)
{
Console.WriteLine("今日の日付です");
}

実務では、期限切れ判定、予約日時の判定、公開日チェックなどでよく使われます。

C#
if (publishDate <= DateTime.Now)
{
Console.WriteLine("公開できます");
}

時刻やタイムゾーンが関係するシステムでは、DateTimeOffset の利用も検討するとよいでしょう。

8-4. リストに要素が存在するか判定する

リストに要素が存在するかどうかは、Any() を使って判定できます。

C#
List<int> numbers = new List<int> { 1, 2, 3 };

if (numbers.Any())
{
Console.WriteLine("要素があります");
}

特定の値が含まれているかは、Contains を使います。

C#
if (numbers.Contains(2))
{
Console.WriteLine("2が含まれています");
}

条件に一致する要素があるかどうかは、Any に条件を指定します。

C#
List<User> users = new List<User>
{
new User { Name = "Taro", IsActive = true },
new User { Name = "Hanako", IsActive = false }
};

if (users.Any(user => user.IsActive))
{
Console.WriteLine("有効なユーザーが存在します");
}

リストがnullの可能性がある場合は、null条件演算子を使えます。

C#
if (users?.Any() == true)
{
Console.WriteLine("ユーザーが存在します");
}

Count > 0 でも判定できますが、存在有無を表すなら Any() の方が意図が伝わりやすい場面が多いです。

8-5. enumの値を判定する

enumは、決まった種類の値を表すときに使います。

C#
enum OrderStatus
{
Pending,
Processing,
Completed,
Canceled
}

enumの値を判定するには、if文やswitchを使います。

C#
OrderStatus status = OrderStatus.Completed;

if (status == OrderStatus.Completed)
{
Console.WriteLine("注文は完了しています");
}

複数の状態を分けるならswitch式が便利です。

C#
string message = status switch
{
OrderStatus.Pending => "未処理です",
OrderStatus.Processing => "処理中です",
OrderStatus.Completed => "完了しました",
OrderStatus.Canceled => "キャンセルされました",
_ => "不明な状態です"
};

enumを使うと、数値や文字列で状態を管理するよりも意味が明確になります。

C#
// 数値だけでは意味がわかりにくい
int status = 2;

// enumなら意味が明確
OrderStatus orderStatus = OrderStatus.Completed;

実務では、注文状態、会員種別、処理ステータス、権限種別などでよく使われます。

8-6. 例外を防ぐための事前判定

C#では、例外が起きる可能性がある処理の前に判定を入れることで、安全に処理できます。

たとえば、文字列を数値に変換するときは、int.Parse ではなく int.TryParse を使うと安全です。

C#
string input = "123";

if (int.TryParse(input, out int number))
{
Console.WriteLine($"変換成功:{number}");
}
else
{
Console.WriteLine("数値に変換できません");
}

リストの先頭要素を取得する前に、要素があるか判定することも大切です。

C#
if (items.Any())
{
Console.WriteLine(items[0]);
}

ファイルが存在するかどうかを判定する例もあります。

C#
if (File.Exists(path))
{
string text = File.ReadAllText(path);
}
else
{
Console.WriteLine("ファイルが存在しません");
}

nullチェックも例外を防ぐための重要な事前判定です。

C#
if (user is null)
{
return;
}

Console.WriteLine(user.Name);

例外を完全になくすことはできませんが、想定できるケースは事前に判定することで、安定したプログラムにできます。

9. C#の判定処理でよくあるミス

9-1. 条件式が複雑になりすぎる

条件式が長くなりすぎると、何を判定しているのかわかりにくくなります。

C#
if (user != null && user.IsActive && user.Age >= 20 && !user.IsDeleted && user.Role == "Admin")
{
Console.WriteLine("処理できます");
}

このような場合は、条件に名前を付けると読みやすくなります。

C#
bool canExecute =
user != null &&
user.IsActive &&
user.Age >= 20 &&
!user.IsDeleted &&
user.Role == "Admin";

if (canExecute)
{
Console.WriteLine("処理できます");
}

さらに、メソッド化すると再利用もしやすくなります。

C#
bool CanExecute(User user)
{
return user.IsActive &&
user.Age >= 20 &&
!user.IsDeleted &&
user.Role == "Admin";
}

条件式は短く、意味がわかる形にすることが大切です。

9-2. nullチェック漏れでエラーになる

nullチェック漏れは、C#でよくあるエラーの原因です。

C#
string? name = null;

Console.WriteLine(name.Length); // エラー

nullの可能性がある値を扱う場合は、先にnullチェックを行います。

C#
if (name is not null)
{
Console.WriteLine(name.Length);
}

または、null条件演算子を使います。

C#
Console.WriteLine(name?.Length);

nullの場合に初期値を使うなら、?? を使います。

C#
int length = name?.Length ?? 0;

nullチェックでは、「nullなら処理しない」「nullなら初期値を使う」「nullならエラーとして扱う」のどれが正しいのかを考えることが重要です。

9-3. 文字列比較で想定外の結果になる

文字列比較では、大文字・小文字の違いや空白の有無に注意が必要です。

C#
string input = "Apple";

if (input == "apple")
{
Console.WriteLine("一致しました");
}
else
{
Console.WriteLine("一致しません");
}

この例では、大文字と小文字が違うため一致しません。

大文字・小文字を区別しない場合は、StringComparison.OrdinalIgnoreCase を指定します。

C#
if (string.Equals(input, "apple", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("一致しました");
}

また、前後の空白が原因で一致しないこともあります。

C#
string input = " apple ";

if (input.Trim() == "apple")
{
Console.WriteLine("一致しました");
}

ユーザー入力を比較するときは、空白、大文字・小文字、nullの可能性を考慮しましょう。

9-4. 型判定とキャストを別々に書いてしまう

型判定とキャストを別々に書くと、コードが冗長になります。

C#
if (value is string)
{
string text = (string)value;
Console.WriteLine(text.Length);
}

この場合は、パターンマッチングを使うと簡潔です。

C#
if (value is string text)
{
Console.WriteLine(text.Length);
}

型判定と代入を同時に行えるため、安全で読みやすくなります。

nullチェックにも応用できます。

C#
if (value is not null)
{
Console.WriteLine(value.ToString());
}

C#では、古い書き方よりもパターンマッチングを使った方が自然なケースが多くあります。

9-5. 三項演算子を多用して読みにくくなる

三項演算子を使いすぎると、コードが読みにくくなります。

C#
string result = score >= 90 ? "A" : score >= 70 ? "B" : score >= 50 ? "C" : "D";

このような入れ子の三項演算子は、ひと目で理解しにくくなります。

if文で書いた方が読みやすい場合もあります。

C#
string result;

if (score >= 90)
{
result = "A";
}
else if (score >= 70)
{
result = "B";
}
else if (score >= 50)
{
result = "C";
}
else
{
result = "D";
}

またはswitch式を使うと整理できます。

C#
string result = score switch
{
>= 90 => "A",
>= 70 => "B",
>= 50 => "C",
_ => "D"
};

三項演算子は、単純な値の切り替えに限定して使うのがおすすめです。

9-6. bool値を冗長に比較してしまう

bool値を判定するときに、== true== false を書きすぎると冗長になります。

C#
if (isActive == true)
{
Console.WriteLine("有効です");
}

通常は、次のように書けば十分です。

C#
if (isActive)
{
Console.WriteLine("有効です");
}

falseを判定したい場合は、! を使います。

C#
if (!isActive)
{
Console.WriteLine("無効です");
}

ただし、bool? のようにnullを持つ場合は話が別です。

C#
bool? isActive = null;

if (isActive == true)
{
Console.WriteLine("有効です");
}

bool? はtrue、false、nullの3状態を持つため、== true のように書くことがあります。

通常のboolでは冗長な比較を避け、Nullableなboolでは意図が明確になるように書きましょう。

10. C#判定処理の使い分け早見表

10-1. if文を使うべきケース

if文は、もっとも基本的で柔軟な判定処理です。

次のような場面ではif文が向いています。

ケース
条件が1つだけif (age >= 20)
複数条件を組み合わせるif (age >= 20 && hasLicense)
nullチェックをするif (user is null)
処理を複数行書く入力チェック、保存処理など
条件が複雑権限、状態、日付などの組み合わせ

if文は、自由な条件式を書けるため、ほとんどの判定処理に対応できます。

C#
if (user is not null && user.IsActive)
{
Console.WriteLine("有効なユーザーです");
}

迷ったら、まずif文で書くのが安全です。

そのうえで、より簡潔に書ける場面では三項演算子やswitch式に置き換えるとよいでしょう。

10-2. 三項演算子を使うべきケース

三項演算子は、条件によって値を切り替える場合に向いています。

ケース
表示文字列を切り替えるisActive ? "有効" : "無効"
代入する値を切り替えるage >= 20 ? "成人" : "未成年"
条件が短い1行で意味がわかる場合
true時とfalse時の値が明確ラベル、メッセージ、数値など
C#
string label = isActive ? "有効" : "無効";

一方、複雑な条件や複数行の処理には向いていません。

C#
if (isValid)
{
Save();
SendMail();
}
else
{
ShowError();
}

三項演算子は、「処理を分ける」のではなく「値を選ぶ」ために使うと考えるとわかりやすいです。

10-3. nullチェックで使う構文

nullチェックでは、目的に応じて構文を使い分けます。

目的書き方
nullか判定するvalue is null
nullでないか判定するvalue is not null
nullなら初期値を使うvalue ?? defaultValue
nullの場合だけ代入するvalue ??= defaultValue
nullでなければアクセスするvalue?.Property
文字列の未入力判定string.IsNullOrWhiteSpace(value)

例を見てみましょう。

C#
if (user is null)
{
return;
}

string name = user.Name ?? "未設定";

int length = user.Name?.Length ?? 0;

nullチェックでは、単にnullかどうかを確認するだけでなく、nullだった場合にどうするのかを明確にしましょう。

10-4. 型判定で使う構文

型判定では、isastypeofGetType() を使い分けます。

構文用途
value is string指定した型として扱えるか判定
value is string text型判定と代入を同時に行う
value as stringキャストできなければnullを返す
typeof(string)型そのものの情報を取得
value.GetType()実行時のインスタンスの型を取得

基本的には、型判定とキャストを同時に行う is 型 変数名 がよく使われます。

C#
if (value is string text)
{
Console.WriteLine(text.Length);
}

完全に同じ型かどうかを確認したい場合は、GetType()typeof を比較します。

C#
if (value.GetType() == typeof(string))
{
Console.WriteLine("実体はstring型です");
}

ただし、GetType() はnullに対して呼び出せないため注意しましょう。

10-5. switchを使うべきケース

switchは、1つの値に対して複数の候補を判定したい場合に向いています。

ケース
statusの値で処理を分ける0, 1, 2
enumの値を判定するOrderStatus.Completed
値に応じて文字列を返すswitch式
型ごとに処理を分けるパターンマッチング
if〜else ifが長くなるswitchで整理
C#
string message = status switch
{
OrderStatus.Pending => "未処理",
OrderStatus.Processing => "処理中",
OrderStatus.Completed => "完了",
_ => "不明"
};

固定値やenumの判定では、switchを使うと見通しがよくなります。

一方で、条件が複雑に絡み合う場合はif文の方が自然です。

11. C#の判定処理に関するよくある質問

11-1. C#でnull判定するおすすめの書き方は?

C#でnull判定をするなら、基本的には is nullis not null が読みやすくおすすめです。

C#
if (user is null)
{
return;
}

if (user is not null)
{
Console.WriteLine(user.Name);
}

nullの場合に初期値を使いたいなら、?? を使います。

C#
string name = inputName ?? "ゲスト";

nullでなければプロパティにアクセスしたい場合は、?. を使います。

C#
int length = name?.Length ?? 0;

状況に応じて、次のように使い分けるとよいでしょう。

C#
// nullなら処理を止める
if (user is null)
{
return;
}

// nullなら初期値を使う
string displayName = user.Name ?? "未設定";

// nullならアクセスしない
user.Profile?.Update();

11-2. isとasの違いは?

is は、指定した型かどうかを判定するために使います。

C#
if (value is string)
{
Console.WriteLine("string型です");
}

さらに、パターンマッチングを使うと、型判定と代入を同時にできます。

C#
if (value is string text)
{
Console.WriteLine(text.Length);
}

一方、as は指定した型へのキャストを試み、失敗した場合はnullを返します。

C#
string? text = value as string;

if (text is not null)
{
Console.WriteLine(text.Length);
}

現在のC#では、型判定とキャストを同時に行う場合は、is string text の方が読みやすいことが多いです。

C#
if (value is string text)
{
Console.WriteLine(text.Length);
}

11-3. if文と三項演算子はどちらを使うべき?

処理を分けたい場合はif文、値を切り替えたい場合は三項演算子を使うのがおすすめです。

if文が向いている例です。

C#
if (isValid)
{
Save();
SendMail();
}
else
{
ShowError();
}

三項演算子が向いている例です。

C#
string message = isValid ? "有効" : "無効";

三項演算子は短く書けますが、複雑な条件に使うと読みにくくなります。

C#
string result = score >= 90 ? "A" : score >= 70 ? "B" : "C";

このような場合は、if文やswitch式を使った方がよいでしょう。

判断基準は、「1行で自然に読めるか」です。

11-4. typeofとGetTypeはどう使い分ける?

typeof は、コード上で指定した型の情報を取得するときに使います。

C#
Type type = typeof(string);

GetType() は、実行時のインスタンスの型を取得するときに使います。

C#
object value = "Hello";

Type type = value.GetType();

型そのものを比較したい場合は、次のように使えます。

C#
if (value.GetType() == typeof(string))
{
Console.WriteLine("実体はstring型です");
}

ただし、GetType() は対象がnullの場合に呼び出せません。

C#
if (value is not null && value.GetType() == typeof(string))
{
Console.WriteLine("string型です");
}

通常の型判定では、まず is を使うことが多いです。

C#
if (value is string text)
{
Console.WriteLine(text.Length);
}

完全に同じ型かどうかを確認したい場合に、GetType()typeof を使うと考えるとよいでしょう。

11-5. bool型の判定はどう書くのが自然?

通常のbool型は、そのままif文に書くのが自然です。

C#
if (isActive)
{
Console.WriteLine("有効です");
}

falseを判定する場合は、! を使います。

C#
if (!isActive)
{
Console.WriteLine("無効です");
}

次のように == true と書く必要はありません。

C#
if (isActive == true)
{
Console.WriteLine("有効です");
}

ただし、bool? の場合はnullの可能性があるため、== true== false を使うことがあります。

C#
bool? isApproved = null;

if (isApproved == true)
{
Console.WriteLine("承認済み");
}
else if (isApproved == false)
{
Console.WriteLine("未承認");
}
else
{
Console.WriteLine("未設定");
}

通常のboolはシンプルに、Nullableなboolはnullを意識して書きましょう。

まとめ

C#の判定処理は、プログラムの流れを制御するための基本です。

if文を使えば、条件に応じて処理を分けられます。

C#
if (age >= 20)
{
Console.WriteLine("成人です");
}
else
{
Console.WriteLine("未成年です");
}

複数条件を組み合わせる場合は、&&||! を使います。

C#
if (age >= 20 && hasLicense)
{
Console.WriteLine("運転できます");
}

nullチェックでは、is nullis not null???. を使い分けることが大切です。

C#
if (user is null)
{
return;
}

string name = user.Name ?? "未設定";

型判定では、is を使ったパターンマッチングが便利です。

C#
if (value is string text)
{
Console.WriteLine(text.Length);
}

単純な値の切り替えには三項演算子、複数の固定値による分岐にはswitch文やswitch式が向いています。

C#
string label = isActive ? "有効" : "無効";

string statusText = status switch
{
0 => "未処理",
1 => "処理中",
2 => "完了",
_ => "不明"
};

C#の判定処理で大切なのは、単に正しく動かすことだけではありません。

後から読んだ人が理解しやすいように、条件式をシンプルにし、nullや型の扱いを明確にすることが重要です。

まずはif文の基本をしっかり押さえ、そのうえでnullチェック、型判定、三項演算子、switch式を使い分けられるようになると、C#のコードはぐっと読みやすく、安全になります。