参照型の既定値は Nothing

 参照型の代表的な型として String があります。String 型の変数に Nothing を代入すると値は Nothing になります。これは Nothing を代入すると、その型の既定値が設定されるためです。参照型には通常、既定値がないためどのインスタンスも参照していない Nothing になります。

参照型の列の既定値は DBNull

 ではこれを DataSet に対して行った場合はどうなるでしょうか。String 型の列を持った DataTable に対して Nothing を代入してみます。すると値が DBNull に変わっています。Nothing を設定しようとすると DBNull を代入した時と同じ動きになります。これは、参照型の列では DBNull と Nothing の代入は等価として扱われているということになります。

String 型の列に Nothing を代入したときのサンプル
Dim t As New DataTable("Test")
t.Columns.Add(New DataColumn("Column1", GetType(String))) ' 参照型の列(String)を作成
t.Rows.Add(New Object() {"初期値"})
t.Rows(0).Item("Column1") = Nothing ' Nothing を代入する
Console.WriteLine(IsDBNull(t.Rows(0).Item("Column1"))) ' Nothing が代入された値は DBNull か?
' Console.WriteLine の結果:True

 変数を初期化する際に(型の既定値を期待して) Nothing で初期化することが少ないため、あまり気にしていなかったのですが、DataSet を扱う際には通常の変数と同じ考えでは意図しない動きになってしまいます。

 参照型の列に対して Nothing を設定すること自体ないのかも知れませんが、この違いを忘れないようにしたいと思います。また、DataColumn.DefaultValue プロパティを設定した場合の動きなども違いがありそうなので、そちらの方もこれから見てみたいと思います。