Conditional— это, по существу, еще одно наименование классаSystem. Diagnostics . ConditionalAttribute.Для применения атрибутаConditionalв исходный код программы следует включить пространство именSystem. Diagnostics.Рассмотрим применение данного атрибута на следующем примере программы.
// Продемонстрировать применение встроенного атрибута Conditional.
#define TRIAL
using System;
using System.Diagnostics;
class Test {
[Conditional("TRIAL")] void Trial {
Console.WriteLine("Пробная версия, не " +
"предназначенная для распространения.");
[Conditional("RELEASE")] void Release {
Console.WriteLine("Окончательная рабочая версия.");
}
static void Main {
Test t = new Test;
t.Trial; //вызывается только в том случае, если // определен идентификатор TRIAL t.ReleaseO; // вызывается только в том случае, если // определен идентификатор RELEASE
}
}
Эта программа дает следующий результат.
Пробная версия, не предназначенная для распространения.
Рассмотрим эту программу подробнее, чтобы стал понятнее результат ее выполнения. Прежде всего обратите внимание на то, что в этой программе определяется идентификаторTRIAL.Затем обратите внимание на определение методовTrial иRelease . Каждому из них предшествует атрибутConditional,общая форма которого приведена ниже:
[Conditional
где
Оба метода,TrialnRelease,вызываются в методеMain. Но поскольку определен один лишь идентификаторTRIAL,то выполняется только методTrial ,тогда как методRelease игнорируется. Если же определить идентификаторRELEASE,то методRelease будет также выполняться. А если удалить определение идентификатораTRIAL,то методTrial выполняться не будет.
АтрибутConditionalможно также применить в классе атрибута, т.е. в классе, наследующем от классаAttribute.Так, если идентификатор определен, то атрибут применяется, когда он встречается в ходе компиляции. В противном случае он не применяется.
На условные методы накладывается ряд ограничений. Во-первых, они должны возвращать значение типаvoid,а по существу, ничего не возвращать. Во-вторых, они должны быть членами класса или структуры, а не интерфейса. И в-третьих, они не могут предшествовать ключевому словуoverride.
Атрибут Obsolete