連載
プロフェッショナルVB.NETプログラミング
第11回 プロシージャとプロシージャ引数
(株)ピーデー
川俣 晶
2002/06/29
|
|
プロシージャ脱出とReturn文
VB 6で、プロシージャの実行を途中で打ち切るには、“Exit Sub”文などを使用する。以下はそれを使用したサンプル・プログラムである。
1: Private Sub Form_Load()
2: Debug.Print "start"
3: Exit Sub
4: Debug.Print "end"
5: End Sub
|
|
“Exit Sub”文を使用したVB 6のサンプル・プログラム8 |
これを実行すると以下のようになる。
見てのとおり、ソース3行目のExit Sub文で“Sub Form_Load()”の処理は中断され、4行目が実行されることはない。
これと同じ機能はVB.NETでも利用できる。以下はそれを示したサンプル・プログラムである。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Trace.WriteLine("start")
3: Exit Sub
4: Trace.WriteLine("end")
5: End Sub
|
|
サンプル・プログラム8をVB.NETで書き換えたサンプル・プログラム9 |
これを実行すると以下のようになる。
さて、VB 6には、遠い昔のご先祖様から継承したGosub文とReturn文というものがある。GoSub文は、現在位置を保存してから指定ラベルに制御を移す。Return文はGoSub文が保存した位置に制御を戻す。これらは、同じコードを異なる場所から呼び出し可能にするサブルーチンというものを実現するために使用される。以下はVB 6でそれを利用した例である。
1: Private Sub Form_Load()
2: Debug.Print "start"
3: GoSub label
4: Exit Sub
5: Debug.Print "end"
6:
7: label:
8: Debug.Print "in subroutine"
9: Return
10:
11: End Sub
|
|
GoSub文とReturn文を使用したVB 6のサンプル・プログラム10 |
これを実行すると以下のようになる。
1: start
2: in subroutine
|
|
サンプル・プログラム10の実行結果 |
しかし、現在ではサブルーチンよりもはるかに強力な機能が多数揃っているので、めったに使われることのない機能と思われる。恐らく使われなくなってから10年以上は経過しているだろう。それを反映してか、VB.NETでは、GoSub文は消滅し、Return文には別の任務が与えられるようになった。
以下は、それを使用した例である。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Trace.WriteLine("start")
3: Return
4: Trace.WriteLine("end")
5: End Sub
|
|
Return文のみを使用したVB.NETのサンプル・プログラム11 |
これを実行すると以下のようになる。
この場合、Return文は、Exit Subと等価の働きをしている。これだけなら、ただ単に違う名前で同じ機能を記述できるだけである。しかし、Return文のもう1つの使い方は、単なる名前の違いではない。
関数の戻り値とReturn文
VB 6では、値を返す関数(Function)を記述することができる。以下はそれを記述してみた例である。
1: Private Function test() As String
2: Debug.Print "start"
3: test = "Hello!"
4: Exit Function
5: Debug.Print "end"
6: End Function
7:
8: Private Sub Form_Load()
9: Debug.Print test()
10: End Sub
|
|
値を返す関数(Function)を記述したVB 6のサンプル・プログラム12 |
これを実行すると以下のようになる。
ここで把握していただきたいことは、以下の2点である。
- 関数の戻り値は、関数名への代入によって決定される
- Exit Function文で関数の動作は中断される
さて、これとほぼ同等のプログラムをVB.NETでも記述することができる。以下はそれを記述した例である。
1: Private Function test() As String
2: Trace.WriteLine("start")
3: test = "Hello!"
4: Exit Function
5: Trace.WriteLine("end")
6: End Function
7:
8: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
9: Trace.WriteLine(test())
10: End Sub
|
|
サンプル・プログラム12と同等の機能を記述したVB.NETのサンプル・プログラム13 |
これを実行すると以下のようになる。
前に上げた2点のポイントが、まったく同様に再現されていることが分かるだろう。しかし、VB.NETでは、関数から値を返す方法がもう1つある。以下はそれを記述してみた例である。
1: Private Function test() As String
2: Trace.WriteLine("start")
3: Return "Hello!"
4: Trace.WriteLine("end")
5: End Function
6:
7: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
8: Trace.WriteLine(test())
9: End Sub
|
|
Return文で値を返す関数を定義したVB.NETのサンプル・プログラム14 |
これを実行すると以下のようになる。
見てのとおり、まったく同じ結果が得られているが、ソース・コードが1行減っていることが分かるだろう。具体的に前の例のソース・コードの3〜4行目に相当する機能が、この例のコード3行目の1行分で実行されていることになる。
Return文のあとには式を書くことができ、これにより、関数が返す値を指定できる。つまり、Return文を用いると、以下の2つの動作がワンセットで行われるということである。
- 関数の戻り値は、Return文の引数によって決定される
- Return文で関数の動作は中断される
このようなReturn文の使い方は、C/C++/Java/C#などのプログラム言語に似ている。そのため、これらのプログラム言語に親しんでいるプログラマーなら容易に理解できるだろう。そうではないプログラマーでも、Return文にはメリットがある。例えばVB 6では関数名を変更するときに、関数名だけでなく、戻り値を指定する代入文も忘れずに書き直す必要があった。しかし、Return文を用いれば、関数名は関数の先頭に1回書くだけでよく、多少手間が減ることになる。また、常に戻り値の指定と関数の終了がワンセットで記述されるため、戻り値を設定することなく、“Exit Function”文を実行してしまう危険を減らすことができる。
Insider.NET 記事ランキング
本日
月間