連載

プロフェッショナルVB.NETプログラミング

第11回 プロシージャとプロシージャ引数

(株)ピーデー
川俣 晶
2002/06/29

Page1 Page2 Page3

省略可能な引数

 VB 6では、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
省略可能な引数とIsMissing関数を使用したVB 6のサンプル・プログラム15

 これを実行すると以下のようになる。

 1:  1
 2:  2
サンプル・プログラム15の実行結果

 ここでは、コードの1行目のOptionalキーワードが省略可能であることを示しており、コード2行目のIsMissing関数の値をチェックすることにより、引数が省略されている場合は3行目を、そうではない場合は5行目を実行するようになっている。

 さて、これに相当するソース・コードを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
サンプル・プログラム15と似た機能を記述したVB.NETのサンプル・プログラム16

 これを実行すると以下のようになる。

 1: 1
 2: 2
サンプル・プログラム16の実行結果

 見て分かるとおり、かなりソースの内容が様変わりした。Optionalキーワードを引数に付加できる点は変わっていないが、IsMissing関数はVB.NETには存在しない。つまり、引数が省略されているかどうかを確認する方法は提供されていない。その代わり、引数にデフォルト値を指定することが可能になった。このソースの1行目にある“ = 0 ”という部分は、デフォルト値の指定である。つまり、ここで記述された引数が省略された場合は、このデフォルト値が指定されたものと見なすというわけである。そのため、ソース7行目のように、引数なしでtest関数を呼び出すと、引数aにはデフォルト値(0)が自動的に補われるのである。

 ここ注意が必要なのは、VB 6では、引数が省略された場合に独自のコードを実行させることが容易であるのに対して、VB.NETでは省略時の値しか指定できないことである。例えばVB 6では、引数省略時に、値をユーザーから入力させるコードも容易に書けるが、VB.NETでは省略時の値はソース・コード上に書き込まねばならない。

Staticの付いたプロシージャ

 VB 6では、プロシージャの宣言にStaticキーワードを付けることができる。すると、プロシージャ内で宣言された変数に、Staticキーワードが付いたかのような効能を与えることができる。以下はそれを実際に記述してみた例である。

  1: Private Static Sub test()
  2:   Dim a As Integer
  3:   a = a + 1
  4:   Debug.Print a
  5: End Sub
  6:
  7: Private Sub Form_Load()
  8:   test
  9:   test
 10:   test
 11: End Sub
プロシージャの宣言にStaticキーワードを付けたVB 6のサンプル・プログラム17

 これを実行すると以下のようになる。

 1:  1
 2:  2
 3:  3
サンプル・プログラム17の実行結果

 ソース2行目の変数aは、Staticの効能が及ぶため、プロシージャを抜けても値が保存され、再び呼び出されると以前の値を使うことができる。

 しかし、VB.NETではこの構文が使えない。Staticキーワードは、Staticの効能を必要とするすべての変数で記述しなければならない。以下はそのようにして書き直した。VB.NETのプログラムである。

  1: Private Sub test()
  2:   Static a As Integer
  3:   a = a + 1
  4:   Trace.WriteLine(a)
  5: End Sub
  6:
  7: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  8:   test()
  9:   test()
 10:   test()
 11: End Sub
サンプル・プログラム17をStatic変数を用いて書き換えたVB.NETのサンプル・プログラム18

 これを実行すると以下のようになる。

 1: 1
 2: 2
 3: 3
サンプル・プログラム18の実行結果

 コード2行目でStaticキーワードを使って変数を宣言していることが読みとれると思う。多少手間は掛かるが、プログラマーの意図がソース上から読みとりやすくなった。

 なお、余談だが、VBだけでなくJava/C#も使える二刀流のプログラマーは、Staticの意味がそれらの言語と異なっていることに注意しておく必要がある。VBのStaticキーワードは、メソッドの呼び出し間で値を維持する静的ローカル変数のために使われるが、Java/C#のstaticキーワードは、インスタンスに属さずクラスに属するメンバを宣言するために使用される。

 Java/C#のstaticに相当するVB.NETでのキーワードはSharedである。これは、関数に付加することができるが、VB 6のStaticキーワードとは意味が違うので、代用品にはならない。実際に以下のようなプログラムを記述してみれば明らかだろう。

  1: Private Shared Sub test()
  2:   Dim a As Integer
  3:   a = a + 1
  4:   Trace.WriteLine(a)
  5: End Sub
  6:
  7: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  8:   test()
  9:   test()
 10:   test()
 11: End Sub
Staticの代わりにSharedを関数に付けたVB.NETのサンプル・プログラム19

 これを実行すると以下のようになる。

 1: 1
 2: 1
 3: 1
サンプル・プログラム19の実行結果

 このように関数の宣言にSharedキーワードを付けることで、ローカル変数に静的な効能が付与されるわけではない。

次回予告

 次回はプロパティの変更点やDebug/Assertクラスなどを取り上げたいと考えている。End of Article


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第11回 プロシージャとプロシージャ引数
    1.ByValとByRefのデフォルト
    2.プロシージャ脱出とReturn文
  3.省略可能な引数
 
「プロフェッショナルVB.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間