連載
プロフェッショナルVB.NETプログラミング
第30回 残されたいくつかのトピック(その1)
(株)ピーデー
川俣 晶
2002/12/21
|
|
条件付き定数
条件付きコンパイル・ステートメントで条件判断に使用する定数は、通常の定数ではなく、条件付き定数と呼ばれるものである。#Constディレクティブを使うと、条件付き定数を定義することができる。以下、#Constディレクティブを使用したサンプル・プログラムを示す。
1: #Const SWITCH1 = True
2: #Const SWITCH2 = False
3:
4: Public Class Form1
5: Inherits System.Windows.Forms.Form
6:
7: …Windows フォーム デザイナで生成されたコード…
8:
9: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
10: #If SWITCH1 Then
11: Console.WriteLine("SWITCH1はオンです")
12: #Else
13: Console.WriteLine("SWITCH1はオフです")
14: #End If
15: #If SWITCH2 Then
16: Console.WriteLine("SWITCH2はオンです")
17: #Else
18: Console.WriteLine("SWITCH2はオフです")
19: #End If
20: #If SWITCH3 Then
21: Console.WriteLine("SWITCH3はオンです")
22: #Else
23: Console.WriteLine("SWITCH3はオフです")
24: #End If
25: End Sub
26: End Class
|
|
#Constディレクティブを使用したサンプル・プログラム8 |
これを実行すると以下のようになる。
1: SWITCH1はオンです
2: SWITCH2はオフです
3: SWITCH3はオフです
|
|
サンプル・プログラム8の実行結果 |
1行目と2行目が、#Constディレクティブを使用した例である。1行目で条件付き定数SWITCH1はTrueに、SWITCH2はFalseに設定している。これにより、10行目の条件判断は真になり、15行目の条件判断は偽となる。その結果、11行目と18行目がコンパイルされ、13行目と16行目はコンパイルされない。
気になるのは、20行目で使用されているSWITCH3というシンボルである。これはどこにも定義されていない。定義されていない条件付き定数は、Nothingという値であると仮定されて処理される。NothingはBoolean型に変換されるとFalse扱いなので、「偽」という判定結果になる。
条件付き定数は#Constディレクティブを使用するほかに、プロジェクトのプロパティとして設定する方法もある。#Constディレクティブを使用する場合は、#Constディレクティブを記述したソース・ファイルのそれ以降でのみ値が有効になるが、プロジェクトのプロパティとして設定すると、プロジェクト中のすべてのソース・ファイルのすべての行で有効になる。設定するには、以下のように、プロジェクトのプロパティの中で、条件付きコンパイル定数のカスタム定数の部分に定義を書き込む。
|
#Constディレクティブの代わりに、プロジェクトのプロパティで設定したカスタム定数 |
領域ディレクティブ
プリプロセスには、ソース・コードのある領域を区切って印を付けるディレクティブがある。#Regionと#End Regionで囲まれた範囲は、領域として区切られる。実際に区切ってみたサンプル・プログラムを以下に示す。
1: Public Class Form1
2: Inherits System.Windows.Forms.Form
3:
4: …Windows フォーム デザイナーで生成されたコード…
5:
6: Private a(9) As Integer
7:
8: #Region "デバッグ用データ出力メソッド"
9: Private Sub debugDump()
10: Dim i As Integer
11: For i = 0 To 9
12: Trace.WriteLine(i)
13: Next
14: End Sub
15: #End Region
16:
17: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
18: Dim i As Integer
19: For i = 0 To 9
20: a(i) = i
21: Next
22: debugDump()
23: End Sub
24: End Class
|
|
#Regionと#End Regionを使用したサンプル・プログラム9 |
領域を区切っても、ビルドした結果には何の影響も及ぼさない。しかし、統合開発環境では便利に使うことができる。統合開発環境のエディタを見ていただきたい。
|
サンプル・プログラム9を統合開発環境のエディタで見た場合 |
この状態で、#Regionの行の左側にある四角で囲まれた-記号をクリックしてみよう。すると以下のようになる。
|
クリックにより#Regionから#End Regionまでを折り畳んだ場合 |
つまり、ワンクリックで、領域を見えないように折り畳んで隠してしまうことができるのである。ソース・コード上に必要だが本来の開発にあまり関係のないものは、領域で囲って隠してしまうと便利である。実際、プロジェクトの新規作成で自動生成したソースでも便利に使われている。この例で、「Windows フォーム デザイナで生成されたコード」という行は、隠された領域にほかならない。この部分は、統合開発環境が自動的に書き直してくれるので、プログラマーが内容を見る必要はない。そのため領域を用いて隠してしまっているわけである。
なお、メソッド本体内で領域は開始も終了もできない。つまり、メソッドの一部だけを隠すような使い方はできない。
次回予告
今回に引き続き、次回も残されたいくつかのトピックについて見ていく。
Insider.NET 記事ランキング
本日
月間