Добавить в цитаты Настройки чтения

Страница 269 из 502

<b>Event</b>

<b>Field</b>

<b>GenericParameter</b>

<b>Interface</b>

<b>Method</b>

<b>Module</b>

<b>Parameter</b>

<b>Property</b>

<b>ReturnValue</b>

<b>Struct</b>

Два этих значения или более можно объединить с помощью логической операции ИЛИ. Например, для указания атрибута, применяемого только к полям и свойствам, используются следующие значения.

<b>AttributeTargets.Field I AttributeTargets.Property</b>

В классе атрибута AttributeUsage поддерживаются два именованных параметра. Первым из них является параметр AllowMultiple, принимающий логическое значение. Если это значение истинно, то атрибут может быть применен к одному и тому же элементу неоднократно. Второй именованный параметр, Inherited, также принимает логическое значение. Если это значение истинно, то атрибут наследуется производными классами, а иначе он не наследуется. По умолчанию параметр AllowMultiple принимает ложное значение (false), а параметр Inherited — истинное значение (true).

В классе атрибута AttributeUsage определяется также доступное только для чтения свойство ValidOn. Оно возвращает значение типа AttributeTargets, определяющее типы элементов, к которым можно применять объявляемый атрибут. По умолчанию используется значение AttributeTargets.All.

Атрибут Conditional представляет, вероятно, наибольший интерес среди всех встроенных атрибутов. Ведь он позволяет создавать условные методы, которые вызываются только в том случае, если с помощью директивы #define определен конкретный идентификатор, а иначе метод пропускается. Следовательно, условный метод служит альтернативой условной компиляции по директиве #if.

Conditional — это, по существу, еще одно наименование класса System.Diagnostics.ConditionalAttribute. Для применения атрибута Conditional в исходный код программы следует включить пространство имен System.Diagnostics. Рассмотрим применение данного атрибута на следующем примере программы.

<b>// Продемонстрировать применение встроенного атрибута Conditional.</b>

<b>#define TRIAL</b>

<b>using System;</b>

<b>using System.Diagnostics;</b>

<b>class Test {</b>

<b>  [Conditional(&quot;TRIAL&quot;)]</b>

<b>  void Trial() {</b>

<b>    Console.WriteLine(&quot;Пробная версия, не &quot; +</b>

<b>              &quot;предназначенная для распространения.&quot;);</b>

<b>    }</b>

<b>  [Conditional(&quot;RELEASE&quot;)]</b>

<b>  void Release() {</b>

<b>    Console.WriteLine(&quot;Окончательная рабочая версия.&quot;);</b>

<b>  }</b>

<b>  static void Main() {</b>

<b>    Test t = new Test();</b>

<b>    t.Trial(); //вызывается только в том случае, если</b>

<b>        // определен идентификатор TRIAL</b>

<b>    t.Release();</b>

<b>    // вызывается только в том случае, если</b>

<b>    // определен идентификатор RELEASE</b>

<b>  }</b>

<b>}</b>

Эта программа дает следующий результат.

<b>Пробная версия, не предназначенная для распространения.</b>

Рассмотрим эту программу подробнее, чтобы стал понятнее результат ее выполнения. Прежде всего обратите внимание на то, что в этой программе определяется идентификатор TRIAL. Затем обратите внимание на определение методов Trial() и Release(). Каждому из них предшествует атрибут Conditional, общая форма которого приведена ниже:

<b>[Conditional идентификатор]</b>

где идентификатор обозначает конкретный идентификатор, определяющий условие выполнение метода. Данный атрибут может применяться только к методам. Если идентификатор определен, то метод выполняется, когда он вызывается. Если же идентификатор не определен, то метод не выполняется.

Оба метода, Trial() и Release(), вызываются в методе Main(). Но поскольку определен один лишь идентификатор TRIAL, то выполняется только метод Trial(), тогда как метод Release() игнорируется. Если же определить идентификатор RELEASE, то метод Release() будет также выполняться. А если удалить определение идентификатора TRIAL, то метод Trial() выполняться не будет.

Атрибут Conditional можно также применить в классе атрибута, т.е. в классе, наследующем от класса Attribute. Так, если идентификатор определен, то атрибут применяется, когда он встречается в ходе компиляции. В противном случае он не применяется.