連載
プロフェッショナルVB.NETプログラミング
第30回 残されたいくつかのトピック(その1)
(株)ピーデー
川俣 晶
2002/12/21
|
|
文字リテラル
VB 6では、1文字だけのデータを表すデータ型はなく、1文字を扱う場合も文字列型を使っていた。しかし、VB.NETでは、1文字を表すChar型が導入されたことで事情が変わった。1文字の「文字列」ではなく、1文字の「文字」を表現する手段が必要になるケースが生じるようになった。以下のサンプル・プログラムを見ていただきたい。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim c1, c2 As Char
3: Dim o1, o2 As Object
4: c1 = "A"
5: c2 = "A"c
6: o1 = "A"
7: o2 = "A"c
8: Trace.WriteLine(c1.GetType().FullName)
9: Trace.WriteLine(c2.GetType().FullName)
10: Trace.WriteLine(o1.GetType().FullName)
11: Trace.WriteLine(o2.GetType().FullName)
12: End Sub
|
|
1文字のデータに対してChar型と文字列型を使い分けたVB.NETのサンプル・プログラム4 |
これを実行すると以下のようになる。
1: System.Char
2: System.Char
3: System.String
4: System.Char
|
|
サンプル・プログラム4の実行結果 |
5行目や7行目のように、ダブルクォートでくくった1文字の後ろに文字「c」を書けば、それは文字リテラルと見なされる。しかし、4行目や6行目のように文字「c」を書かない場合は、1文字の「文字列」と見なされる。結果の3行目と4行目を見れば、明らかだろう。
Nothingの振る舞いの変更
Nothingキーワードは、何も参照が存在しないことを意味するキーワードである。VB 6では、オブジェクトの参照にしか使えないものである。例えばInteger型にNothingを代入しようとするとコンパイル・エラーになる。以下がコンパイル・エラーとなるサンプル・プログラムである。
1: System.CharPrivate Sub Form_Load()
2: Dim a As Integer
3: a = Nothing
4: Debug.Print a
5: End Sub
|
|
Integer型にNothingを代入しようとしてエラーとなるVB 6のサンプル・プログラム5 |
これと同じようにVB.NETでもInteger型にNothingを代入するサンプル・プログラムを記述してみた。
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
|
|
Integer型にNothingを代入しているVB.NETのサンプル・プログラム6 |
これはビルドでき、実行もできる。実行した結果は以下のようになる。
VB.NETでは、Nothingキーワードはどんな値にも変換できる。つまり、Integer型の変数に代入できる。変換されるとき、Nothingの値はその型のデフォルト値と見なされる。Integer型なら0がデフォルト値なので、0という値が変数aに代入されたというわけである。
条件付きコンパイル
VB.NETには、「プリプロセス」という機能が追加されている。これは、コンパイル処理の本体が実行される前に実行される機能で、ソース・コードの構造と独立して、ソース・コードに関する指示を埋め込むことを可能にする。その中で、最も利用頻度が高いものは、条件付きコンパイル機能だろう。以下に、DebugビルドとRelaseビルドで異なるコードを使用するサンプル・プログラムを示す。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: #If Debug Then
3: Trace.WriteLine("Debug Build")
4: #Else
5: Trace.WriteLine("Release Build")
6: #End If
7: End Sub
|
|
条件付きコンパイル機能を使用したVB.NETのサンプル・プログラム7 |
これをDebugビルドで実行すると以下のような結果になる。
|
サンプル・プログラム7の実行結果(Debugビルドで実行した場合) |
これをReleaseビルドで実行すると以下のような結果になる。
|
サンプル・プログラム7の実行結果(Releaseビルドで実行した場合) |
ビルドによって結果に差が出るのは、Debugビルドの場合と、Releaseビルドの場合で、異なるソース・コードの行がコンパイルされているためである。つまり、ビルドの差は、実行時に判定されるのではなく、ビルド時に判定されている。
具体的に、ある範囲のソース・コードをビルド対象としたり、対象から外したりするために、#If、#Else、#ElseIf、#Endifの4つのディレクティブが使用される。このサンプル・プログラムの2、4、6行目がそれに当たる。もし、2行目に記述された条件が成立していれば、2行目と4行目の間がビルドされ、そうでないときは、4行目と6行目の間がビルドされる。
2行目で示されている条件は、定数式である。ここでは、Debugというシンボルが判定の対象になっている。これは、コンパイラが提供している条件付きコンパイル定数で、DebugビルドのときにTrueになるという機能を与えられている。これは、プロジェクトのプロパティでカスタマイズできる。
|
プロジェクトのプロパティにある条件付きコンパイル定数の設定 |
このダイアログ・ボックスで、DEBUG定数の定義のチェックを外すと、Debugビルドでも、Debugの値はTrueにならず、Releaseビルドと同じ実行結果になる。
Insider.NET 記事ランキング
本日
月間