VB.NETの「Nothing」を正しく理解したい

VB.NETの「Nothing」を正しく理解したい

「NULL」
何のデータも含まれない状態のことです。
データベースやプログラムで度々見かけますね。

「VB.NET」
Microsoft社により開発されたプログラミング言語です。

「VB.NETではNULLではなくNothingを使うんだよ」
VB.NET初学者はみんなこう教えられて育ったことと思います。
しかし厳密にはNULL≠Nothing、全くの別物です。
では何が違うのか?
今回は「Nothing」について学びなおそう、という内容です。

「Nothing」とは?

当然ですが、公式のドキュメントにNothingの全てが書いてあります。
https://learn.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/nothing
もしあなたがVB.NETやプログラミングに明るく、堅い文章が読めるのであれば、
公式のドキュメントから知識を得るのが最善でしょう。
この記事ではもう少し嚙み砕いた言葉で整理していきます。

Nothingとは、データ型の規定値を表すキーワードです。
データ型には値が設定されていない初期状態の値として
規定値というものが設定されています。
(各データ型でググれば規定値を知ることができます。)

つまり、「変数 = Nothing」と代入式を書くと、
その変数のデータ型に設定された規定値を変数に代入する
という処理になるわけです。
例えば、この変数のデータ型がInteger型であれば、
上の処理で代入されるのは「0」となります。
「変数 = 0」と書いたのと変わりません。

もちろん、規定値がNULLであればNULLになります。
そのため部分的にはNULL=Nothingのように見える
書き方がされることもあります。
厳密には違うということに注意しましょう。

規定値についてもう少し

データ型には値型参照型があります。
値型は、データを直接格納するタイプで、
例えばInteger型やDouble型のような数値型やBoolean型などです。
参照型は、データへの参照を格納するタイプで、
例えばString型や配列などです。

ざっくり言うと、
値型の規定値はNULLではなく、
参照型の規定値はNULL(NULL参照)です。

そもそも値型はNULLを扱えないのですが、
値型に「?」を付けたNULL許容型に関しては、
NULLを扱うことができます。
(正確には、規定値は「値なし」)

=演算子、Is演算子

関係比較演算子である「=」と「Is」は
Nothingと絡んでよく混同されますね。

「=」は値を比較しており、
「= Nothing」では規定値との比較となります。

「Is」はオブジェクト参照を比較しており、
「Is Nothing」ではNULL参照との比較となります。
(この時の「Nothing」はNULL参照のオブジェクト型)

まとめ

公式のドキュメントに全てが書かれていると書きましたが、
実際のところ知りたいことが必ず書かれているわけではありません。
Nothingや周辺知識についてもっと詳しくなりたいと思ったら、
実際に書いて試したり、問い合わせするしかありません。
地道に知識を蓄えていきましょう。