|   | 
  | 
連載
改訂版 
プロフェッショナルVB.NETプログラミング
Chapter 01 基本構文の変化 
株式会社ピーデー
川俣 晶 
2004/02/19 | 
 | 
 
 | 
 VB 6では、Optionalキーワードを付加することで、省略可能な引数を指定できる。ある引数が省略されているか否かは、IsMissing関数で調べることが可能である。以下は実際にそれらを用いて記述してみた例である。
 
 1: Private Function test(Optional ByVal a As Valiant) 
 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 
 | 
 
 
 | 
 
  リスト1-35 省略可能な引数とIsMissing関数を使用したプログラム
 | 
 これを実行すると以下のようになる。
| 
 | 
 
  リスト1-36 リスト1-35の実行結果
 | 
 ここでは、ソースの1行目のOptionalキーワードが省略可能であることを示しており、ソース2行目のIsMissing関数の値をチェックすることにより、引数が省略されている場合は3行目を、そうではない場合は5行目を実行するようになっている。
 さて、これに相当するソース・コードをVB.NETで記述するとどうなるだろうか。なるべく同じような機能を持つように記述したのが、次のリスト1-37である。
 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 
 | 
 
 
 | 
 
  リスト1-37 リスト1-35と似た機能を記述したVB.NETのプログラム
 | 
 これを実行すると以下のようになる。
| 
 | 
 
  リスト1-38 リスト1-37の実行結果
 | 
 見て分かるとおり、かなりソースの内容が様変わりした。Optionalキーワードを引数に付加できる点は変わっていないが、IsMissing関数はVB.NETには存在しない。つまり、引数が省略されているかどうかを確認する方法は提供されていない。しかし、VB6でも使用可能だった引数にデフォルト値を指定する方法が残されている。このソースの1行目にある“ = 0 ”という部分は、デフォルト値の指定である。つまり、ここで記述された引数が省略された場合は、このデフォルト値が指定されたものと見なすというわけである。このため、ソース7行目のように、引数なしでtest関数を呼び出すと、引数aにはデフォルト値(0)が自動的に補われるのである。
 ここで注意が必要なのは、VB 6では引数が省略された場合に独自のコードを実行させることが容易であるのに対して、VB.NETでは省略時の値しか指定できないことである。例えばVB 6では、引数省略時に値をユーザーから入力させるコードも容易に書けるが、VB.NETでは省略時の値はソース・コード上に書き込まねばならない。
 もう1つの相違点は、引数の型にある。VB 6においてIsMissing関数で省略可能な引数を調べる場合、引数の型はVariant型でなければならない。これは、引数を省略していることを示す情報がVariant型にしか格納されないことによる。しかし、VB.NETではIsMissiong関数が存在しないので、そのような制約を意識することなく、どのような型の引数を使用しても問題はない。その意図を示すために、VB 6のサンプル・ソースではVariant型であるのに対して、VB.NETのサンプル・ソースはInteger型を指定している。
 Nothingキーワードは、何も参照が存在しないことを意味するキーワードで、VB 6ではオブジェクトの参照にしか使えないものである。例えば、Integer型にNothingを代入しようとするとコンパイルエラーになる。リスト1-39は、そのサンプル・プログラムである。
1: System.CharPrivate Sub Form_Load() 
2:   Dim a As Integer 
3:   a = Nothing 
4:   Debug.Print a 
5: End Sub 
 | 
 
 
 | 
 
  リスト1-39 Integer型にNothingを代入しようとしてエラーとなるプログラム
 | 
 これと同じように、VB.NETでもInteger型にNothingを代入するサンプル・プログラムを記述してみた(リスト1-40)。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
2:   Dim a As Integer 
3:   a = Nothing 
4:   Trace.WriteLine(a) 
5: End Sub 
 | 
 
 
 | 
 
  リスト1-40 Integer型にNothingを代入しているVB.NETのプログラム
 | 
 これはビルドでき、実行もできる。実行した結果は以下のようになる。
| 
 | 
 
  リスト1-41 リスト1-40の実行結果
 | 
 VB.NETでは、Nothingキーワードはどんな値にも変換できる。つまり、Integer型の変数に代入できる。変換されるときは、Nothingの値はその型のデフォルト値と見なされる。この例では、Integer型なら0がデフォルト値なので、0という値が変数aに代入されたというわけである。
 伝統的な古いBASIC言語といえば、行番号が付き物である。いまさら使う人はいないかもしれないが、場合によっては旧世代のソースを資産として使っている場合もあり得るので、VB.NETでの行番号の使用について、ここで簡単に触れておく。
 VB 6では、行番号のあとに空白文字を入れて、そのままステートメントを記述することが可能だった。また、行番号とは一種のラベルなので、ラベルと同じように番号の後ろにコロン(:)記号を書いてもよい。もちろん、番号ではなくラベルとして名前を書き、その後にコロン記号を書くことも許される。これを示したのが次のサンプル・プログラムだ(リスト1-42。先頭の1:などは、読みやすくするための本連載で付加した行番号。10や20:がVB 6の行番号に当たる)。
1: Private Sub Form_Load() 
2:    GoTo 10 
3: 10 Debug.Print "Hello1" 
4:    GoTo 20 
5: 20: Debug.Print "Hello2" 
6:    GoTo label 
7: label: Debug.Print "Hello3" 
8: End Sub 
 | 
 
 
 | 
 
  リスト1-42 行番号(コロン記号あり/なし)とラベルを使用したVB 6のプログラム
 | 
 これを実行すると以下のようになる。
| 
 | 
 
  リスト1-43 リスト1-42の実行結果
 | 
 これに対し、VB.NETでは、行番号の後ろにコロン記号を置かずに、そのまま継続してステートメントを書く構文は許されない。そのため、行番号の後ろには必ずコロン記号を書かねばならない。リスト1-42をVB.NETで書き直したものがリスト1-44である。
1:     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
2:       GoTo 10 
3: 10:   Trace.WriteLine("Hello1") 
4:       GoTo 20 
5: 20:   Trace.WriteLine("Hello2") 
6:       GoTo label 
7: label:  Trace.WriteLine("Hello3") 
8:     End Sub 
 | 
 
 
 | 
 
  リスト1-44 行番号のあとに必ずコロン記号が必要になるVB.NETのプログラム
 | 
 これを実行すると以下のようになる。
| 
 | 
 
  リスト1-45 リスト1-44の実行結果
 | 
 この相違は、実用上はさほど重要ではない。なぜなら、行番号の付いたソース・コードをIDEのソース編集ウィンドウに書き込むと、IDEが自動的に行番号の後ろにコロン記号を挿入してくれるためである。
 
  | 
  | 
 
 
| 更新履歴 | 
 
 
 
【2004/12/7】本ページの「省略可能な引数」の部分に以下のような誤りがありました。お詫びして訂正させていただきます。 
 
リスト1-35 
| 誤 | 
1: Private Function test(Optional ByVal a As Integer) | 
 
| 正 | 
1: Private Function  test(Optional ByVal a As Variant) | 
 
 
 
本文
| 誤 | 
  見て分かるとおり、かなりソースの内容が様変わりした。Optionalキーワードを引数に付加できる点は変わっていないが、IsMissing関数はVB.NETには存在しない。つまり、引数が省略されているかどうかを確認する方法は提供されていない。その代わり、引数にデフォルト値を指定することが可能になった。このソースの1行目にある“ = 0 ”という部分は、デフォルト値の指定である。つまり、ここで記述された引数が省略された場合は、このデフォルト値が指定されたものと見なすというわけである。このため、ソース7行目のように、引数なしでtest関数を呼び出すと、引数aにはデフォルト値(0)が自動的に補われるのである。 
 ここで注意が必要なのは、VB 6では引数が省略された場合に独自のコードを実行させることが容易であるのに対して、VB.NETでは省略時の値しか指定できないことである。例えばVB 6では、引数省略時に値をユーザーから入力させるコードも容易に書けるが、VB.NETでは省略時の値はソース・コード上に書き込まねばならない。 
 | 
 
| 正 | 
  見て分かるとおり、かなりソースの内容が様変わりした。Optionalキーワードを引数に付加できる点は変わっていないが、IsMissing関数はVB.NETには存在しない。つまり、引数が省略されているかどうかを確認する方法は提供されていない。しかし、VB6でも使用可能だった引数にデフォルト値を指定する方法が残されている。このソースの1行目にある“ = 0 ”という部分は、デフォルト値の指定である。つまり、ここで記述された引数が省略された場合は、このデフォルト値が指定されたものと見なすというわけである。このため、ソース7行目のように、引数なしでtest関数を呼び出すと、引数aにはデフォルト値(0)が自動的に補われるのである。 
 ここで注意が必要なのは、VB 6では引数が省略された場合に独自のコードを実行させることが容易であるのに対して、VB.NETでは省略時の値しか指定できないことである。例えばVB 6では、引数省略時に値をユーザーから入力させるコードも容易に書けるが、VB.NETでは省略時の値はソース・コード上に書き込まねばならない。 
 もう1つの相違点は、引数の型にある。VB 6においてIsMissing関数で省略可能な引数を調べる場合、引数の型はVariant型でなければならない。これは、引数を省略していることを示す情報がVariant型にしか格納されないことによる。しかし、VB.NETではIsMissiong関数が存在しないので、そのような制約を意識することなく、どのような型の引数を使用しても問題はない。その意図を示すために、VB 6のサンプル・ソースではVariant型であるのに対して、VB.NETのサンプル・ソースはInteger型を指定している。 
 | 
 
 
 | 
 
 
 | 
 
	
		業務アプリInsider 記事ランキング
		
		
			本日
			月間