連載

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

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

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

Page1 Page2 Page3

プロシージャ脱出と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

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

 1: start
サンプル・プログラム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

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

 1: start
サンプル・プログラム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

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

 1: start
サンプル・プログラム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

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

 1: start
 2: Hello!
サンプル・プログラム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

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

 1: start
 2: Hello!
サンプル・プログラム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: start
 2: Hello!
サンプル・プログラム14の実行結果

 見てのとおり、まったく同じ結果が得られているが、ソース・コードが1行減っていることが分かるだろう。具体的に前の例のソース・コードの3〜4行目に相当する機能が、この例のコード3行目の1行分で実行されていることになる。

 Return文のあとには式を書くことができ、これにより、関数が返す値を指定できる。つまり、Return文を用いると、以下の2つの動作がワンセットで行われるということである。

  • 関数の戻り値は、Return文の引数によって決定される
  • Return文で関数の動作は中断される

 このようなReturn文の使い方は、C/C++/Java/C#などのプログラム言語に似ている。そのため、これらのプログラム言語に親しんでいるプログラマーなら容易に理解できるだろう。そうではないプログラマーでも、Return文にはメリットがある。例えばVB 6では関数名を変更するときに、関数名だけでなく、戻り値を指定する代入文も忘れずに書き直す必要があった。しかし、Return文を用いれば、関数名は関数の先頭に1回書くだけでよく、多少手間が減ることになる。また、常に戻り値の指定と関数の終了がワンセットで記述されるため、戻り値を設定することなく、“Exit Function”文を実行してしまう危険を減らすことができる。


 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 記事ランキング

本日 月間