Поделиться через


Conditional (руководство по программированию на C#)

Обновлен: Ноябрь 2007

Делает выполнение метода зависимым от идентификатора предварительной обработки. Атрибут Conditional является псевдонимом для ConditionalAttribute и может применяться к методу или атрибуту class.

В данном примере атрибут 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()
{
}

Заметки

Если вызывается метод, помеченный как условный, то наличие или отсутствие заданного символа предварительной обработки определяет, включен этот вызов или опущен. Если символ указан, то вызов включается; в противном случае вызов опускается. Использование атрибута Conditional представляет собой более понятную, элегантную и менее подверженную ошибкам альтернативу вложению методов в #if и #endif:

#if DEBUG
void ConditionalMethod()
{
}
#endif

Условный метод должен быть методом в объявлении класса или структуры и должен возвращать тип 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 с классами атрибутов

Атрибут 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