misc.log

日常茶飯事とお仕事と

値型とNothingの比較(VB.NET)

VB.NETでは、通常は参照型の空参照として扱われるNothingとの比較は「Is Nothing」や「IsNot Nothing」で行う*1。しかし、対象が値型変数の場合、通常のイコールやノットイコール(=や<>)で比較が出来る。これ、案外知らない人が多い。

ではこのときに何が起きるのか。以下のコードを試しに実行してみてほしい。

        Dim test As Integer = 0

        If test = Nothing Then
            MessageBox.Show("nothing")
        Else
            MessageBox.Show("not nothing")
        End If

Integer型で宣言した変数testにはゼロを設定する。その後、testがNothingかどうかをイコールで判断すると……Nothingと判定される。このように、値型をNothingと比較した場合、その型の「初期値」かどうかという判定になる。その代わり、相手が値型の場合には比較に「Is」や「IsNot」は使えない。

この仕様、なんとかならんもんかなぁ。余計な機能だと思う。混乱を来すし、いちいち「どうだったっけ?」って思い出すだけ時間の無駄。

*1:IsNotはVisual Basic 8.0、.NET Framework 2.0に対応したVB.NETから使えるようになった演算子。それ以前はNot ~ Is ~ と書くしか無かった。