連載

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

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

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

Page1 Page2 Page3

条件付き定数

 条件付きコンパイル・ステートメントで条件判断に使用する定数は、通常の定数ではなく、条件付き定数と呼ばれるものである。#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 フォーム デザイナで生成されたコード」という行は、隠された領域にほかならない。この部分は、統合開発環境が自動的に書き直してくれるので、プログラマーが内容を見る必要はない。そのため領域を用いて隠してしまっているわけである。

 なお、メソッド本体内で領域は開始も終了もできない。つまり、メソッドの一部だけを隠すような使い方はできない。

次回予告

 今回に引き続き、次回も残されたいくつかのトピックについて見ていく。End of Article


 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 記事ランキング

本日 月間