Conditional (C# 程式設計手冊)

更新:2007 年 11 月

根據前置處理識別項執行方法。Conditional 屬性 (Attribute) 是 ConditionalAttribute 的別名 (Alias),可以套用至方法或屬性類別

在此範例中,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 識別項,就不會顯示任何追蹤輸出。

Conditional 屬性通常與 DEBUG 識別項搭配使用,以便為偵錯組建啟用追蹤和記錄功能,而不是在發行的組建中使用,如下所示:

[Conditional("DEBUG")]
static void DebugMethod()
{
}

備註

呼叫標記為條件的方法時,指定的前置處理符號是否存在,將會決定是要包含或省略呼叫。如果有定義符號,則會包括呼叫,否則,將省略呼叫。相對於在 #if#endif 內部封入方法,使用 Conditional 更為整潔雅緻,並且也是出錯可能較低的替代方法。

#if DEBUG
void ConditionalMethod()
{
}
#endif

條件式方法必須是類別或結構 (Struct) 宣告中的方法,並且必須具有 void 的傳回型別。

使用多個識別項

如果方法擁有多個 Conditional 屬性,至少定義了其中一個條件符號,則會包括這個方法的呼叫 (換句話說,在邏輯上,符號全都是以 OR 的計算方式而在一起)。在此範例中,A 或 B 的存在將會產生方法呼叫:

[Conditional("A"), Conditional("B")]
static void DoIfAorB()
{
    // ...
}

若要達成邏輯 AND 符號的效果,您可以定義一系列的條件式方法。例如,以下的第二個方法只會在 A 和 B 兩者都有定義時才會執行:

[Conditional("A")]
static void DoIfA()
{
    DoIfAandB();
}

[Conditional("B")]
static void DoIfAandB()
{
    // Code to execute when both A and B are defined...
}

為屬性類別使用條件

Conditional 屬性也可以套用至屬性類別定義。在此範例中,只有在 DEBUG 有定義時,自訂屬性 Documentation 才會將資訊加入中繼資料。

[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