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());
    }
}

参照

概念

C# プログラミング ガイド

参照

リフレクション (C# プログラミング ガイド)

属性 (C# プログラミング ガイド)

属性の対象の明確化 (C# プログラミング ガイド)

カスタム属性の作成 (C# プログラミング ガイド)

リフレクションによる属性へのアクセス (C# プログラミング ガイド)

System.Reflection

Attribute