連載
プロフェッショナルVB.NETプログラミング
第11回 プロシージャとプロシージャ引数
(株)ピーデー
川俣 晶
2002/06/29
|
|
省略可能な引数
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行目の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 |
これを実行すると以下のようになる。
見て分かるとおり、かなりソースの内容が様変わりした。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 |
これを実行すると以下のようになる。
ソース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 |
これを実行すると以下のようになる。
コード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 |
これを実行すると以下のようになる。
このように関数の宣言にSharedキーワードを付けることで、ローカル変数に静的な効能が付与されるわけではない。
次回予告
次回はプロパティの変更点やDebug/Assertクラスなどを取り上げたいと考えている。
Insider.NET 記事ランキング
本日
月間