連載

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

第30回 残されたいくつかのトピック(その1)

(株)ピーデー
川俣 晶
2002/12/21

Page1 Page2 Page3

文字リテラル

 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

 これはビルドでき、実行もできる。実行した結果は以下のようになる。

 1: 0
サンプル・プログラム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ビルドで実行すると以下のような結果になる。

 1: Debug Build
サンプル・プログラム7の実行結果(Debugビルドで実行した場合)

 これをReleaseビルドで実行すると以下のような結果になる。

 1: Release Build
サンプル・プログラム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ビルドと同じ実行結果になる。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第30回 残されたいくつかのトピック(その1)
    1.型文字と新しいデータ型/整数リテラルと浮動小数点リテラル
  2.文字リテラル/Nothingの振る舞いの変更/条件付きコンパイル
    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 記事ランキング

本日 月間