C#でプログラムを書いていると、
「オブジェクト参照がインスタンスに設定されていません」というエラーに出くわしたことはありませんか?
これは、配列やリストが null のまま使われているときによく発生するエラーです。
特に初心者のうちは、「変数は作ったのに、なぜnullになるの?」と戸惑う人も多いでしょう。
このエラーは「変数やリストがnullのまま使われた」ときに発生しますが、
本当の問題は“エラーそのもの”ではなく、なぜnullが存在してしまうのかという設計上の部分にあります。
多くのプログラマーは「nullをチェックする」「try-catchで防ぐ」といった後追いの対処をします。
しかし、より安全でメンテナブルなコードを目指すなら、
「nullを作らない・返さない設計」を心がけるべきです。
本記事では、
C#で配列やリストがnullにならないようにする工夫というところに着目して紹介します。
これらを意識するだけで、NullReferenceExceptionの発生率は劇的に下がります。
「エラーを防ぐ」から「エラーを生まない」コードへ。
一歩進んだC#設計のヒントとして、ぜひ参考にしてください。
配列やリストにnullが入ってしまう原因について
まずは、なぜ配列やリストがnullになるのかをみていきましょう。
主な原因例
- 初期化(new)を忘れている
- 条件分岐内でのみ初期化しており、他のパスではnullのまま
- DBやAPIからのデータ取得時に「空」と「null」の違いを混同している
- クラスのフィールドを初期化せずに使っている
List<string> names;
names.Add("Taro"); // ← 初期化していないため、System.NullReferenceExceptionエラーが発生このように、newを忘れるだけで落ちるのがC#の落とし穴です。
nullを防ぐための基本テクニック
初期化を必ず行う
リストや配列を宣言するときに、必ず初期化しておくのが鉄則です。
// リストの場合
List<string> names = new List<string>();
// 配列の場合(サイズを指定して初期化)
string[] items = new string[0]; // 空配列として安全これにより、アクセスしてもnull参照エラーは発生しません。
フィールド初期化をコンストラクタで統一
クラスで管理している場合は、コンストラクタ内で必ず初期化しておくと安全です。
public class UserManager
{
private List<string> users;
public UserManager()
{
users = new List<string>();
}
}このようにすることで、users が常に有効な状態で使用できます。
null合体演算子(??)を活用する
C#には ??(null合体演算子)があります。
nullのときにデフォルト値を代入することで、安全に処理が行えます。
List<int> numbers = GetNumbers() ?? new List<int>();もし GetNumbers() が null を返しても、numbers には空のリストが代入されます。
Nullオブジェクトパターンを導入する
設計レベルでnullを扱わないために、「Nullオブジェクトパターン」を採用する方法もあります。
例えば、「データがない場合でも空リストを返す」メソッド設計を徹底します。
public List<string> GetNames()
{
var result = _repository.FetchNames();
return result ?? new List<string>();
}呼び出し側でnullチェックを毎回書く必要がなくなり、コードの見通しが良くなります。
nullを返さない設計を意識する
アプリケーション全体で「nullを返さない文化」を作ると、バグが減ります。
具体的なルールの例
- メソッドは常に「空オブジェクト」を返す
- データ取得系では
nullではなくnew List<T>()を返す - 受け取る側では「nullチェックではなくCountチェック」を行う
if (list.Count == 0)
{
Console.WriteLine("データがありません。");
}C# 8.0以降なら「nullable参照型」を活用する
C# 8.0以降では、nullable参照型(Nullable Reference Types) というnullの可能性がある変数をコンパイル時に警告できる機能が導入されました。これを活用することでも、nullが起きても安全なコード設計がしやすくなります。
#nullable enable
List<string>? names = null; // nullableとして明示nullを防ぐ対策方法のまとめ
| 状況 | 対応策 |
|---|---|
| 初期化忘れ | 宣言時に new で初期化 |
| メソッドの戻り値がnull | ?? new List<T>() で安全化 |
| クラスフィールドがnull | コンストラクタで初期化 |
| 設計上のnull発生 | Nullオブジェクトパターン導入 |
| null検知したい | Nullable参照型を有効化 |
まとめ
「nullに悩まされるコード」は、ほんの少しの設計意識で減らすことができます。
“nullを返さない”・“常に初期化する”という2つの原則を意識すれば、
C#の堅牢で安定したコードを実現できます。


コメント