デバッグなどの用途で記述したテスト用のコード(例えば、コンソールへデバッグ・メッセージを出力するようなコード)は、できれば通常のリリース版のプログラムには含めたくない。本稿では、そのようなテスト用のコードをデバッグ版にのみ含めて、デバッグ時にしか実行されないようにする方法を紹介する。
この方法には、Conditional属性(以降、条件属性)を使う方法と、条件付きコンパイル・ディレクティブ(#ifディレクティブ。以降、条件ディレクティブ)を使う方法の2つがある。どちらの方法も、「条件付きコンパイル定数」と呼ばれる定数に従って、テスト用(デバッグ用)のコードがコンパイルされるかどうかが決定される。
条件付きコンパイル定数は、Visual Studio .NETでひな型プロジェクトを作成すると、次の画面のようにプロジェクトのプロパティにあらかじめ設定されている。
上記の画面を見れば分かるように、Visual Studio .NETのひな型プロジェクトでは、デバッグ用の条件付きコンパイル定数として「DEBUG」という文字列がデフォルトで設定されている。なお、この条件付きコンパイル定数は、コマンドラインやコードで指定することも可能だが、本稿では割愛する(詳しくはMSDN「条件付きコンパイル定数の宣言」を参照されたい)。
それでは、条件属性を使う方法と条件ディレクティブを使う方法を、それぞれ解説していこう。
条件属性を使う方法では、ConditionalAttribute属性(System.Diagnostics名前空間。「Attribute」の部分を省略して「Conditional」と記述することもできる)を、メソッドに付ける(この属性が指定できるのはメソッドのみ。この属性が付いたメソッドは「条件付きメソッド」と呼ばれる)。これにより、このConditional属性の付いたメソッドは、条件付きで実行されるようになる。
デバッグ時にのみ実行したいメソッドには、次のようにメソッドにConditional("DEBUG")属性を付ければよい。
using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("Mainメソッド実行");
Class1.Test("Testメソッド実行");
// Class1.Testメソッドはデバッグ時のみ実行
}
[Conditional("DEBUG")]
static private void Test(string message)
{
Console.WriteLine(message);
}
}
}
Module Module1
Sub Main()
Console.WriteLine("Mainメソッド実行")
Module1.Test("Testメソッド実行")
' Module1.Testメソッドはデバッグ時のみ実行
End Sub
<Conditional("DEBUG")> _
Private Sub Test(ByVal message As String)
Console.WriteLine(message)
End Sub
End Module
Conditional("DEBUG")属性の付いたメソッドとその呼び出し個所は、条件付きコンパイル定数として「DEBUG」が定義されている場合にのみコンパイルされる。また条件付きメソッドは、その戻り値がvoid型でなければならないなど、いくつか制限事項がある(詳しくは、MSDN「Conditional属性」を参照すること)。
条件ディレクティブを使う方法では、#if DEBUG〜#endifディレクティブ(C#の場合)/#If DEBUG Then〜#End If(VB.NETの場合)により、デバッグ時にのみ実行したいコードを囲えばよい。具体的には次のようなコードになる。
using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("Mainメソッド実行");
#if DEBUG
Class1.Test("Testメソッド実行");
#endif
// Class1.Testメソッドはデバッグ時のみ実行
}
#if DEBUG
static private void Test(string message)
{
Console.WriteLine(message);
}
#endif
}
}
Module Module1
Sub Main()
Console.WriteLine("Mainメソッド実行")
#If DEBUG Then
Module1.Test("Testメソッド実行")
#End If
' Module1.Testメソッドはデバッグ時のみ実行
End Sub
#If DEBUG Then
Private Sub Test(ByVal message As String)
Console.WriteLine(message)
End Sub
#End If
End Module
上記コードのように条件ディレクティブを使うことには、必ずしもメソッドだけではなく、自由な範囲でデバッグ用のコードを指定できるというメリットがある。例えば、クラス全体をデバッグ時にだけ実行されるように指定することも可能だ。
カテゴリ:C# 処理対象:デバッグ
カテゴリ:Visual Basic .NET 処理対象:デバッグ
使用ライブラリ:ConditionalAttribute属性(System.Diagnostics名前空間)
使用キーワード:#ifディレクティブ
使用キーワード:#Ifディレクティブ
Copyright© Digital Advantage Corp. All Rights Reserved.