連載
» 2005年01月07日 05時00分 UPDATE

.NET TIPS:テスト用コードをデバッグ時にのみ実行するには?

[一色政彦,デジタルアドバンテージ]
「.NET TIPS」のインデックス

連載目次

 デバッグなどの用途で記述したテスト用のコード(例えば、コンソールへデバッグ・メッセージを出力するようなコード)は、できれば通常のリリース版のプログラムには含めたくない。本稿では、そのようなテスト用のコードをデバッグ版にのみ含めて、デバッグ時にしか実行されないようにする方法を紹介する。

 この方法には、Conditional属性(以降、条件属性)を使う方法と、条件付きコンパイル・ディレクティブ(#ifディレクティブ。以降、条件ディレクティブ)を使う方法の2つがある。どちらの方法も、「条件付きコンパイル定数」と呼ばれる定数に従って、テスト用(デバッグ用)のコードがコンパイルされるかどうかが決定される。

条件付きコンパイル定数の指定

 条件付きコンパイル定数は、Visual Studio .NETでひな型プロジェクトを作成すると、次の画面のようにプロジェクトのプロパティにあらかじめ設定されている。

条件付きコンパイル定数の設定(Visual C# .NET) 条件付きコンパイル定数の設定(Visual C# .NET)
Visual C# .NETでは、プロジェクトのプロパティで条件付きコンパイル定数として「DEBUG」が指定されている。
  (1)[ソリューション エクスプローラ]のプロジェクトを右クリックしてコンテキスト・メニューを表示し、そのメニューから[プロパティ]を選択することで、[<プロジェクトの> プロパティ ページ]ダイアログが表示される。
  (2)[<プロジェクトの> プロパティ ページ]ダイアログでは、左のツリーから[構成プロパティ]−[ビルド]を選択すると、右のプロパティ設定の[条件付きコンパイル定数]の欄に「DEBUG」が指定されている。なお、リリース・モードではこの「DEBUG」が指定されていないので、デバッグ時とリリース時で条件分岐できるようになる。

条件付きコンパイル定数の設定(Visual Basic .NET) 条件付きコンパイル定数の設定(Visual Basic .NET)
Visual Basic .NETでは、プロジェクトのプロパティで条件付きコンパイル定数として「DEBUG」が指定されている。
  (1)[ソリューション エクスプローラ]のプロジェクトを右クリックしてコンテキスト・メニューを表示し、そのメニューから[プロパティ]を選択することで、[<プロジェクトの> プロパティ ページ]ダイアログが表示される。
  (2)[<プロジェクトの> プロパティ ページ]ダイアログでは、左のツリーから[構成プロパティ]−[ビルド]を選択すると、右のプロパティ設定の[条件付きコンパイル定数]の[DEBUG定数の定義]のチェック・ボックスにチェックが入っている。なお、リリース・モードではこのチェックが外されているので、デバッグ時とリリース時で条件分岐できるようになる。

 上記の画面を見れば分かるように、Visual Studio .NETのひな型プロジェクトでは、デバッグ用の条件付きコンパイル定数として「DEBUG」という文字列がデフォルトで設定されている。なお、この条件付きコンパイル定数は、コマンドラインやコードで指定することも可能だが、本稿では割愛する(詳しくはMSDN「条件付きコンパイル定数の宣言」を参照されたい)。

 それでは、条件属性を使う方法と条件ディレクティブを使う方法を、それぞれ解説していこう。

条件属性(Conditional属性)を使う方法

 条件属性を使う方法では、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);
    }
  }
}

条件属性(Conditional属性)によりデバッグ時にのみ実行されるサンプル・プログラム(C#)
太字の部分のコードにより、そのメソッドは条件付きメソッドとなり、デバッグ時にしか実行されないようになる。

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属性)によりデバッグ時にのみ実行されるサンプル・プログラム(VB.NET)
太字の部分のコードにより、そのメソッドは条件付きメソッドとなり、デバッグ時にしか実行されないようになる。

 Conditional("DEBUG")属性の付いたメソッドとその呼び出し個所は、条件付きコンパイル定数として「DEBUG」が定義されている場合にのみコンパイルされる。また条件付きメソッドは、その戻り値がvoid型でなければならないなど、いくつか制限事項がある(詳しくは、MSDN「Conditional属性」を参照すること)。

条件付きコンパイル・ディレクティブ(#ifディレクティブ)を使う方法

 条件ディレクティブを使う方法では、#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
  }

}

条件ディレクティブ(#ifディレクティブ)によりデバッグ時にのみ実行されるサンプル・プログラム(C#)
太字の部分のコードのようにして、#if <条件>ディレクティブ〜#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

条件ディレクティブ(#Ifディレクティブ)によりデバッグ時にのみ実行されるサンプル・プログラム(VB.NET)
太字の部分のコードのようにして、#If <条件> Thenディレクティブ〜#End Ifディレクティブでデバッグ時にのみ実行したいコードを囲う。

 上記コードのように条件ディレクティブを使うことには、必ずしもメソッドだけではなく、自由な範囲でデバッグ用のコードを指定できるというメリットがある。例えば、クラス全体をデバッグ時にだけ実行されるように指定することも可能だ。

カテゴリ:C# 処理対象:デバッグ
カテゴリ:Visual Basic .NET 処理対象:デバッグ
使用ライブラリ:ConditionalAttribute属性(System.Diagnostics名前空間)
使用キーワード:#ifディレクティブ
使用キーワード:#Ifディレクティブ


「.NET TIPS」のインデックス

.NET TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。