В классе атрибута AttributeUsage
поддерживаются два именованных параметра. Первым из них является параметр AllowMultiple
, принимающий логическое значение. Если это значение истинно, то атрибут может быть применен к одному и тому же элементу неоднократно. Второй именованный параметр, Inherited
, также принимает логическое значение. Если это значение истинно, то атрибут наследуется производными классами, а иначе он не наследуется. По умолчанию параметр AllowMultiple
принимает ложное значение (false
), а параметр Inherited — истинное значение (true
).
В классе атрибута AttributeUsage
определяется также доступное только для чтения свойство ValidOn
. Оно возвращает значение типа AttributeTargets
, определяющее типы элементов, к которым можно применять объявляемый атрибут. По умолчанию используется значение AttributeTargets.All
.
Атрибут Conditional
представляет, вероятно, наибольший интерес среди всех встроенных атрибутов. Ведь он позволяет создавать #define
определен конкретный идентификатор, а иначе метод пропускается. Следовательно, условный метод служит альтернативой условной компиляции по директиве #if
.
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.Release();
// вызывается только в том случае, если
// определен идентификатор RELEASE
}
}
Эта программа дает следующий результат.
Пробная версия, не предназначенная для распространения.
Рассмотрим эту программу подробнее, чтобы стал понятнее результат ее выполнения. Прежде всего обратите внимание на то, что в этой программе определяется идентификатор TRIAL
. Затем обратите внимание на определение методов Trial()
и Release()
. Каждому из них предшествует атрибут Conditional
, общая форма которого приведена ниже:
[Conditional идентификатор]
где
Оба метода, Trial()
и Release()
, вызываются в методе Main()
. Но поскольку определен один лишь идентификатор TRIAL
, то выполняется только метод Trial()
, тогда как метод Release()
игнорируется. Если же определить идентификатор RELEASE
, то метод Release()
будет также выполняться. А если удалить определение идентификатора TRIAL
, то метод Trial()
выполняться не будет.
Атрибут Conditional
можно также применить в классе атрибута, т.е. в классе, наследующем от класса Attribute
. Так, если идентификатор определен, то атрибут применяется, когда он встречается в ходе компиляции. В противном случае он не применяется.
На условные методы накладывается ряд ограничений. Во-первых, они должны возвращать значение типа void
, а по существу, ничего не возвращать. Во-вторых, они должны быть членами класса или структуры, а не интерфейса. И в-третьих, они не могут предшествовать ключевому слову override
.
Атрибут Obsolete
(сокращенное наименование класса System.ObsoleteAttribute
) позволяет пометить элемент программы как устаревший. Ниже приведена общая форма этого атрибута:
[Obsolete ("сообщение") ]