連載

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

Chapter 01 基本構文の変化

株式会社ピーデー 川俣 晶
2004/02/19
Page1 Page2 Page3 Page4

 本記事は、(株)技術評論社が発行する書籍『VB6プログラマーのための入門 Visual Basic .NET 独習講座』の一部分を許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。

 省略可能な引数

 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:  1
2:  2
リスト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: 1
2: 2
リスト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の振る舞いの変更

 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: 0
リスト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のプログラム

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

Hello1
Hello2
Hello3
リスト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のプログラム

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

Hello1
Hello2
Hello3
リスト1-45 リスト1-44の実行結果

 この相違は、実用上はさほど重要ではない。なぜなら、行番号の付いたソース・コードをIDEのソース編集ウィンドウに書き込むと、IDEが自動的に行番号の後ろにコロン記号を挿入してくれるためである。End of Article

VB6プログラマーのための入門 Visual Basic .NET 独習講座』

 本記事は、(株)技術評論社が発行する書籍『VB6 プログラマーのための 入門 Visual Basic .NET 独習講座』から
許可を得て転載したものです。

【本連載と書籍の関係について 】
 この書籍は、本フォーラムで連載した「連載 プロフェッショナルVB.NETプログラミング」を大幅に加筆修正し、発行されたものです。技術評論社、および著者である川俣晶氏のご好意により、書籍の内容を本フォーラムの連載記事として掲載させていただけることになりました。

技術評論社の解説ページ

ご注文はこちらから
 

 INDEX
  [連載] 改訂版 プロフェッショナルVB.NETプログラミング
  Chapter 01 基本構文の変化
    1.型文字と新しいデータ型/整数リテラルと浮動小数点リテラル/文字リテラル
    2.日付リテラルについての注意点/変数の宣言をカンマ区切りで続けた場合の相違/変数のスコープ
    3.引数の値渡し(ByVal)と参照渡し(ByRef)のデフォルト/プロパティの参照渡し/可変長引数の参照と値
  4.省略可能な引数/Nothingの振る舞いの変更/行番号使用時のコロン(:)記号
 
「改訂版 プロフェッショナルVB.NETプログラミング 」

更新履歴
【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.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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH