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
где
Оба метода,Trial()nRelease(),вызываются в методеMain(). Но поскольку определен один лишь идентификаторTRIAL,то выполняется только методTrial (),тогда как методRelease() игнорируется. Если же определить идентификаторRELEASE,то методRelease() будет также выполняться. А если удалить определение идентификатораTRIAL,то методTrial() выполняться не будет.
АтрибутConditionalможно также применить в классе атрибута, т.е. в классе, наследующем от классаAttribute.Так, если идентификатор определен, то атрибут применяется, когда он встречается в ходе компиляции. В противном случае он не применяется.
На условные методы накладывается ряд ограничений. Во-первых, они должны возвращать значение типаvoid,а по существу, ничего не возвращать. Во-вторых, они должны быть членами класса или структуры, а не интерфейса. И в-третьих, они не могут предшествовать ключевому словуoverride.
Атрибут Obsolete