Страница 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("TRIAL")]</b>
<b> void Trial() {</b>
<b> Console.WriteLine("Пробная версия, не " +</b>
<b> "предназначенная для распространения.");</b>
<b> }</b>
<b> [Conditional("RELEASE")]</b>
<b> void Release() {</b>
<b> Console.WriteLine("Окончательная рабочая версия.");</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. Так, если идентификатор определен, то атрибут применяется, когда он встречается в ходе компиляции. В противном случае он не применяется.