【備忘録】C#のnullチェックはなぜ必要?必要性と記述方法7選

C#

皆さん、こんにちは!
上越市を拠点にし、「FA設備・装置開発」と「画像処理」に強い会社、NSIです!
私達は豊富な経験と専門知識で、各種業界の自動化・システム化のお手伝いをしています。

長かった冬も終わりに近づき、もうすぐ春ですね。
3月に入り、これからどんどん暖かくなっていくまであと少し!
暖かくなると出かけたくなりますが、この時期は花粉も元気に飛び回っています…。
花粉症の皆さん、今年も気を引き締めて行きましょう!

今回は久しぶりのプログラムネタです。
C#のnullチェック
必要性と記述方法」についてまとめてみました。

nullチェックの必要性とは?

プログラミングにおける null(ヌル)とは、「何もない状態」や「値が設定されていない状態」を意味します。この状態を、トイレットペーパーに例えてみましょう。

通常、トイレットペーパーホルダー(= holder)には、何らかのトイレットペーパーがセットされています。しかし、nullの状態とは、「ホルダーが完全に空っぽ」の状態です。

C#をはじめとする多くの言語では、参照型(class や string などのオブジェクト)がnull になる可能性があります。しかし、null のまま変数にアクセスしようとすると、NullReferenceException というエラーが発生し、プログラムがクラッシュする原因になります。そのため、トイレットペーパーがあるかどうかを確認するように、適切な null チェックを行うことが重要です。

nullチェックが必要な理由として、主に次の理由が挙げられます。

  • プログラムの安定性を確保
    NullReferenceException を防ぐことで、アプリケーションが予期せずクラッシュするのを防ぐ。
  • 可読性と保守性の向上
    明示的に null をチェックすることで、コードの意図が明確になり、他の開発者が理解しやすくなる。
  • バグの予防
    null による意図しない挙動(例: データが取得できない、処理が進まない)を未然に防げる。

nullチェックの方法

C# ではnullによるエラーを防ぐために、さまざまなnull チェックの方法が用意されています。
ここでは、それぞれの方法とメリット・デメリットをコード付きで分かりやすく解説していきます!

1.if文

null チェックの最も基本的な方法は、if 文を使ったnullチェックです。

if (obj == null)
{
    Console.WriteLine("obj is null");
}
else
{
    Console.WriteLine("obj is not null");
}

⭕ 直感的で分かりやすく、C#すべてのバージョンで使用可能。
❌ 冗長になりがちで、簡単なnullチェックでも行数が増えてしまう。

2.三項演算子(? :)

if 文の代わりに三項演算子を使うと、null チェックを1行で記述できます。

string message = (obj == null) ? "obj is null" : "obj is not null";
Console.WriteLine(message);

⭕ コードを短く書けるため、簡単なnullチェックに最適。
❌ 複雑な条件には向かず、可読性が下がることがある。

3.null 合体演算子(??)

??演算子を使うと、nullの場合にデフォルト値を代入できます。
例えば、nullの場合に “Default Name” を設定するには次のように書きます。

string name = null;
string displayName = name ?? "Default Name";
Console.WriteLine(displayName);

⭕ デフォルト値を設定でき、nullによるエラーを防げる。
❌ デフォルト値が不要な場合は使いにくく、関数呼び出しを入れるとパフォーマンス影響が出ることがある。

4.null 条件演算子(?.)

?.演算子を使うと、nullの場合にプロパティやメソッドのアクセスをスキップできるので、NullReferenceExceptionを防ぐことができます。

int? count = obj?.Count; // obj が null の場合、count には null が入る
Console.WriteLine(count);

⭕ null の場合でも安全にプロパティやメソッドにアクセスできる。
❌ 戻り値が null になるため、その後の処理に注意する必要がある。

5.null 合体演算子(??)と null 条件演算子(?.)

?. で安全にアクセスし、?? でデフォルト値を設定する方法は、nullチェックの方法として非常に強力です。

List<int> numbers = null;
int count = numbers?.Count ?? 0;
Console.WriteLine(count); // 出力: 0

⭕ nullによるエラーを防ぎつつ、デフォルト値を設定可能。
❌ どこでnullが発生するかを意識して使う必要があり、少し難しく感じる。

6.is null / is not null

C# 7.0 以降では、is nullを使ってnullチェックをより分かりやすく記述できます。

if (obj is null)
{
    Console.WriteLine("obj is null");
}
if (obj is not null)
{
    Console.WriteLine("obj is not null");
}

⭕ != null よりも可読性が上がり、nullチェックの意図が明確になる。
❌ C#7.0以降でしか使えない。

7.null 許容参照型(Nullable Reference Types)

C# 8.0以降では、null許容参照型を有効にすると コンパイラがnullの可能性を警告してくれます。

string? nullableString = null;   // OK
string nonNullableString = null; // コンパイルエラー(null非許容)

⭕ コード記述時に警告が出るため、nullによるバグを未然に防げる。
❌ C#8.0以降でしか使えない。

まとめ

各方法を様々な観点から、表にまとめてみました。

簡潔さ → コードが短くすっきりしているか?
安全性 → NullReferenceException を防ぐのに有効か?
可読性 → コードが直感的に理解しやすいか?
パフォーマンス影響 → 軽量に動作するか?

方法説明C#のバージョン簡潔さ安全性可読性パフォーマンス影響
if文基本のnullチェック全バージョン
三項演算子(? :)コンパクトなif文全バージョン
長くなると読みにくい
??(null 合体演算子)null のときにデフォルト値を設定C#6.0~
値が必要

デフォルト値の設定方法によっては影響あり
?.(null 条件演算子)nullのときにアクセスをスキップC#6.0~
?? + ?.?? と ?. を組み合わせるC#6.0~
is null / is not nullIf文の可読性を向上C#7.0~
Nullable Reference Typesnullの可能性を型レベルで管理C#8.0~
コンパイラの警告処理あり
べんぞうくん
べんぞうくん

状況に応じて、適切な方法を選ぶのがベスト!

最後に

今回は C#のnullチェックの必要性と記述方法 について解説しました。
null チェックにはさまざまな記述方法があり、状況に応じて適切な方法を選ぶことが重要です。
適切な null チェックを行うことで、エラーを防ぎつつ、読みやすく保守しやすいコードを書くことができます。

ここまで読んでいただき、ありがとうございました。
ご質問・ご要望・ご相談などは、下記お問い合わせフォームからお気軽にご連絡ください。
http://www.net-nsi.co.jp/toiawase.html

べんぞうくん
べんぞうくん

この記事が役に立ったらGoodボタンを押してね~

タイトルとURLをコピーしました