VB は、あまり詳しくないのですが、
VB6 では、Optional キーワードを付加することで、省略可能な引数を指定できる。ある引数が省略されているか否かは、IsMissing 関数で調べることが可能である。以下は実際にそれらを用いて記述してみた例である。
1: Private Function test(Optional ByVal a As Integer)
2: If IsMissing(a) Then
3: test = 1
4: Else
5: test = a + 1
6: End If
7: End Function
8:
9: Private Sub Form_Load()
10: Dim a As Integer
11: a = test()
12: Debug.Print a
13: a = test(a)
14: Debug.Print a
15: End Sub
引数が Variant 型でないのに IsMissing 関数で判定できるのですか? Integer 型の場合は 0 が初期値として入ると思います。
さて、これに相当するソースコードを VB.NET で記述するとどうなるだろうか。なるべく同じような機能を持つように記述したのが、以下のプログラムである。
1: Private Function test(Optional ByVal a As Integer = 0)
2: test = a + 1
3: End Function
4:
5: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
6: Dim a As Integer
7: a = test()
8: Trace.WriteLine(a)
9: a = test(a)
10: Trace.WriteLine(a)
11: End Sub
いや、Optional 引数を省略した時のデフォルト値は、VB6 でも同じように書くことができます。VB6 でもできることを、VB.NET で置き換えたかのように書きますと、VB6 ではできないかのように聞こえますね。
見て分かるとおり、かなりソースの内容が様変わりした。Optional キーワードを引数に付加できる点は変わっていないが、IsMissing 関数は VB.NET には存在しない。つまり、引数が省略されているかどうかを確認する方法は提供されていない。
元の VB6 も IsMissing 関数で判定できるのは Variant 型として渡される引数だけです。よって、同じように書こうとするならば、引数を System.Object 型にして IsNothing 関数を使うことになるでしょう。
VB.NET
1: Private Function test(Optional ByVal a As Object = Nothing)
2: If IsNothing(a) Then
3: test = 1
4: Else
5: test = a + 1
6: End If
7: End Function
IsMissing 関数が消えたのは、Variant 型がなくなったからでしょう。Missing value は Variant 型でしか扱っていなかったのです。その Variant 型が消え、取って代わった存在になったのが System.Object 型です。Object 型は VB6 までのそれとは違って、すべての型の総称になっています。そして、Object 型の初期値は Null (Nothing) 参照なので、IsNothing という名前に置き換わっているのだと思います。(まあ、普通は Is 演算子 + Nothing を使うでしょうけど)
冒頭の前提が間違っているので、こういう記事になったのでしょう。日付からして今さらの突っ込みかもしれませんが、今日たまたま発見したので書いてしまいました。そのほかの記事でも、突っ込みたいところはあったのですが省略します。