DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

デバッグビルドでのみ特定のコードがコンパイルされるようにする
条件付きコンパイル定数を使用する

デバッグの時のみテストのためのコードを挿入したいといったケースがよくあります。そのような時に、リリースでビルドする前に手作業でそのコードを削除していたのでは面倒なだけでなく、バグの原因ともなります。

このようなケースではプリプロセッサディレクティブを使うと便利です。次のコードでは、デバッグバージョンでビルドされた時のみ「Console.WriteLine...」コードがコンパイルされます。

VB.NET
コードを隠すコードを選択
#If DEBUG Then
    Console.WriteLine("デバッグバージョンです。")
#End If
C#
コードを隠すコードを選択
#if DEBUG
    Console.WriteLine("デバッグバージョンです。");
#endif

上のコードはDEBUGコンパイラディレクティブが有効な時に「Console.WriteLine...」コードがコンパイルされるようにするものです。Visual Studioではデフォルトで、デバッグビルドにおいてDEBUGディレクティブが有効になり、リリースビルドでは無効になるため、上記のような使い方が可能になります。(これを変更する方法は後ほど説明します。)

デバッグのときのみメソッドを有効にする

また、メソッドについて同様の事を行うには、Conditional属性を使用します。次の例ではShowMessageメソッドは条件付きメソッドとなり、DEBUGディレクティブが有効な時のみメソッドの呼び出しがコンパイルされます。なお、Conditional属性を指定する際、そのメソッドはvoid型の戻り値(戻り値なし)である必要があります。

VB.NET
コードを隠すコードを選択
'DEBUGが定義されている時のみ有効となる
<Conditional("DEBUG")> _
Public Shared Sub ShowMessage(ByVal str As String)
    Console.WriteLine(str)
End Sub
C#
コードを隠すコードを選択
//DEBUGが定義されている時のみ有効となる
[Conditional("DEBUG")] 
public static void ShowMessage(string str) 
{ 
    Console.WriteLine(str); 
}

デバッグのときのみ出力する

さらに、簡単な情報の出力等だけならば、Debugクラスを使う方法もあります。詳しくはこちらをご覧ください。

DEBUGディレクティブの有効、無効を変更する

構成別のDEBUGディレクティブの有効、無効はVisual Studioの設定により変更することができます。メニューの「プロジェクト」-「...のプロパティ」で表示される「プロパティページダイアログ」の「構成プロパティ」-「ビルド」を選択し、「コード生成」-「条件付きコンパイル定数」に"DEBUG"があればDEBUGディレクティブは有効となり、無ければ無効になります。

補足:Visual Studioを使わない場合は、/defineオプションにより、設定ができます。(例:/define:DEBUG)

さらに、コード内で#defineプリプロセッサディレクティブ(VB.NETでは#Const)により定義することもできます。#defineディレクティブはファイルの先頭に記述します。なお逆に未定義にするには、#undefを使用します(VB.NETでは「#Const BEDUG = False」のようにする)。

VB.NET
コードを隠すコードを選択
'#Const BEDUG = True
'がファイルの先頭に記述されているものとする

#If DEBUG Then
    Console.WriteLine("デバッグバージョンです。")
#End If
C#
コードを隠すコードを選択
//#define DEBUG
//がファイルの先頭に記述されているものとする

#if DEBUG
    Console.WriteLine("デバッグバージョンです。");
#endif
補足:
今までの説明ではDEBUGディレクティブのみ使用しましたが、目的に応じてこのような条件付きコンパイル定数(シンボル)を自分で定義し、使用することももちろんできます。そのときの定義及び使用方法は今まで説明したとおりです。

また、今までは
#if ...
#endif
のみを使用してきましたが、
#if ...
#elif ...
#else
#end if
といった使い方も出来ます。
VB.NET
コードを隠すコードを選択
#If DEBUG Then
    Console.WriteLine("デバッグバージョンです。")
#ElseIf TRACE Then
    Console.WriteLine("TRACEが定義されています。")
#Else
    Console.WriteLine("DEBUGもTRACEも定義されていません。")
#End If
C#
コードを隠すコードを選択
#if DEBUG
    Console.WriteLine("デバッグバージョンです。");
#elif TRACE
    Console.WriteLine("TRACEが定義されています。");
#else
    Console.WriteLine("DEBUGもTRACEも定義されていません。");
#endif