Conditional (C# プログラミング ガイド)
更新 : 2007 年 11 月
プリプロセス ID に応じて、メソッドを実行するようにします。Conditional 属性は、ConditionalAttribute のエイリアスであり、メソッドまたは属性クラスに適用できます。
この例で、Conditional は、プログラム固有の診断情報について表示/非表示を切り替えるメソッドに適用されます。
#define TRACE_ON
using System;
using System.Diagnostics;
public class Trace
{
[Conditional("TRACE_ON")]
public static void Msg(string msg)
{
Console.WriteLine(msg);
}
}
public class ProgramClass
{
static void Main()
{
Trace.Msg("Now in Main...");
Console.WriteLine("Done.");
}
}
TRACE_ON ID が定義されていないと、トレース出力は表示されません。
Conditional 属性は、リリース ビルドではなく、次のようにデバッグ ビルドでトレース機能とログ機能を有効にするときに、DEBUG ID でよく使用されます。
[Conditional("DEBUG")]
static void DebugMethod()
{
}
解説
Conditional とマークされたメソッドが呼び出される場合、指定したプリプロセスのシンボルが存在するかどうかで、呼び出しが含まれるかどうかが決まります。シンボルが定義されている場合は呼び出しが行われ、定義されていない場合は呼び出しは行われません。メソッドを #if (C# リファレンス) や #endif (C# リファレンス) で囲むのではなく、次のように Conditional を使用すると、コードがわかりやすく洗練され、ミスが発生する可能性が低くなります。
#if DEBUG
void ConditionalMethod()
{
}
#endif
条件付きのメソッドは、クラスまたは構造体の宣言にあるメソッドにする必要があります。また、戻り値の型は void (C# リファレンス) にします。
複数 ID の使用
メソッドで複数の Conditional 属性が指定されている場合は、条件シンボルの 1 つでも定義されているとメソッドの呼び出しが行われます。つまり、複数のシンボルは論理 OR で結合されます。この例では、A または B が存在する場合、メソッドが呼び出されます。
[Conditional("A"), Conditional("B")]
static void DoIfAorB()
{
// ...
}
論理 AND 演算でシンボルを結合するには、条件付きメソッドを順番に定義します。たとえば、次の 2 つ目のメソッドは、A と B の両方が定義されている場合にのみ実行されます。
[Conditional("A")]
static void DoIfA()
{
DoIfAandB();
}
[Conditional("B")]
static void DoIfAandB()
{
// Code to execute when both A and B are defined...
}
属性クラスでの Conditional の使用
Conditional 属性は、属性クラスの定義にも適用できます。この例のカスタム属性 Documentation では、DEBUG が定義されている場合にのみ、メタデータに情報が追加されます。
[Conditional("DEBUG")]
public class Documentation : System.Attribute
{
string text;
public Documentation(string text)
{
this.text = text;
}
}
class SampleClass
{
// This attribute will only be included if DEBUG is defined.
[Documentation("This method displays an integer.")]
static void DoWork(int i)
{
System.Console.WriteLine(i.ToString());
}
}