たまに「じゃんぬねっと」が生存確認をする日記

役員より労働者の方が絶対楽だと思う

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  984  : 記事  4  : コメント  38811  : トラックバック  277

ニュース

My Website

初心者向けのサイトです。

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

最近のできごと

低学歴の IT エンジニア兼管理職です。ずっとリモートワーク中。

駆け出しはブラック企業で低年収でしたが、転職を繰り返して年収は 5 倍以上になりました。

年収はこれ以上増えても幸せ指数は増えませんので、趣味の時間を増やすため早期の半リタイアを考えています。

最高の配偶者、可愛い娘、ハンサムな息子と幸せな日々を送っています。

息子の将来の夢はゲーム実況者らしい。がんばれー^^。

Sponsored Link1

Sponsored Link2

Archive

書庫

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

# re: IsMissing 関数についての間違い 2010/05/21 18:50 ^-^
Optionalだとこの処理は必需品ですよね^^
でなきゃバグバグになっちゃう~

# re: IsMissing 関数についての間違い 2011/06/09 17:02 tikage
どちらにしろ.NETでは引数が省略されたかは分からないのですね。
例えば test(Nothing) と test() を実行したときに、
関数testの引数aが 指定されたNothingか省略されたNothingなのかを知れたら嬉しかったのですが..

# LNiUEqPDCMPp 2022/04/19 14:16 johnanz
http://imrdsoacha.gov.co/silvitra-120mg-qrms

Post Feedback

タイトル
名前
Url:
コメント: