「損失をもたらす」と避けられるnullが抱える問題

値が何もない定義として長らく利用されてきた「null」。特にC#ではnullが重宝されてきた事実があります。しかし、ここにきてnullが大きな損害をもたらす存在として危険視されはじめているのです。

一部の識者の間では「nullを完全に排除すべきだ」とする動きさえ起きています。今回はnullが生まれた背景や、nullを排除すべきケース、nullを避けるための考え方など、nullにまつわるさまざまな問題について深掘りしていきます。

nullの未初期化領域を残すことはトラブルの原因に…

まずはnullが生まれた背景についておさらいしておきましょう。そもそも、nullは不定動作を防ぐ、初期化の考え方として生まれたものです。不定動作とは、不定な値を表示する動作を指します。例えば、C#のunsafeコンテキストにおいて、確保したメモリの領域には以前使用した値が入っているのが通常です。当然、表示すれば以前の値がそのまま表示されます。毎回、何の情報もわからない値を表示するわけですから、この値自体ははすなわち「不定」と考えることできます。

不定動作はバグのもととなるので、安全とはいえません。何等かの方法で不定な値の初期化を行うことになります。一方で、不定な値が残った状態を「未初期化」と呼びます。通常のC#では、未初期化状態を残しておくことはありません。

フィールドの配列、要素はすべて規定値による初期化、つまり0初期化されるためです。そして、この0初期化の内のひとつが今回お話しする「null」ということになります。nullや他の0初期化が行われていない未初期化領域を残しておくことは、トラブルの原因になるということを覚えておきましょう。

nullを排除した方が良い3つのケース

冒頭では、nullが問題視されているということをお伝えしました。nullがコードの中で問題を引き起こし得る3つのケースを例として以下にご紹介します。

■フラグとして使う場合

nullをフラグとして使われる場合は、さまざまな問題が生じ得ます。フラグとしてnullを使用すると、跡で読み返したとき処理の内容によってnullが意味するところが変わってきてしまいます。複数回nullが登場するときなどは特に、コードが必要以上に難解になってしまうでしょう。

誤解されそうな場合

SQLにといてはx=nullではなくx is [not] nullと書く必要があります。「UNKNOWN」としてのnullと、「データがないこと」を意味するnullという2種類のnullが存在しているのがその理由です。つまり、SQLを知らない人にとってnullは誤解を生む要因となるのです。

■nullになるケースを見落とす場合

プログラムによってはnullになるケースを見落とし、エラーが出てしまうことも少なくありません。こうした可能性が懸念される場合は、「何もないこと」を示す他のオブジェクトを使用することでエラーを回避できることも多いようです。

次のページ:
今後nullとどのように付き合っていくか

 

関連する記事

facebook

案件情報や最新記事をお届けします。
ぜひチェックしてみてください。