じゃんぬねっと日誌

ネタと雑記と時々プログラミング

目次

Blog 利用状況

ニュース

不況すぎる件。

スポンサードリンク

運営サイト

  • C# と VB.NET の入門サイト

書庫

IsMissing 関数についての間違い

VB は、あまり詳しくないのですが、

プロフェッショナル VB.NET プログラミング 第 11 回 プロシージャとプロシージャ引数 (atmarkit.co.jp) からの引用

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 を使うでしょうけど)

冒頭の前提が間違っているので、こういう記事になったのでしょう。日付からして今さらの突っ込みかもしれませんが、今日たまたま発見したので書いてしまいました。そのほかの記事でも、突っ込みたいところはあったのですが省略します。

投稿日時 : 2007年4月19日 16:09

コメントを追加

# re: IsMissing 関数についての間違い 2007/04/20 8:59 frontline

IsMissingなんて知らなかった俺、参上!(一応VB5~の人)。
デフォルト値無しでOptionalなんて使ったこと無いですわ。

# re: IsMissing 関数についての間違い 2007/04/20 9:10 じゃんぬねっと

IsMissing と組み合わせて検索したら、ご本人様の訂正ページを発見。
@IT の方の記事も直した方が良いような気がします。
ttp://mag.autumn.org/Content.modf?id=20040710134539

タイトル  
名前  
URL
コメント