Вот к какому результату приводит выполнение этого кода. Атрибуты в классе UseAttrib: RemarkAttribute Примечание: В этом классе используется атрибут. Дополнение: Это дополнительная информация. Приоритет: 10
В данном примере обращает на себя внимание порядок указания атрибутов перед классом UseAttrib, как показано ниже. [RemarkAttribute("В этом классе используется атрибут.", Supplement = " Это дополнительная информация.", Priority = 10)] class UseAttrib { // ... }
Именованные параметры атрибутов Supplement и Priority не обязательно ука зывать в каком-то определенном порядке. Порядок их указания можно свободно из менить, не меняя сами атрибуты.
И последнее замечание: тип параметра атрибута (как позиционного, так и имено ванного) должен быть одним из встроенных простых типов, object, Туре, перечисле нием или одномерным массивом одного из этих типов. Встроенные атрибуты
В C# предусмотрено несколько встроенных атрибутов, но три из них имеют осо бое значение, поскольку они применяются в самых разных ситуациях. Это атрибуты AttributeUsage, Conditional и Obsolete, рассматриваемые далее по порядку. Атрибут AttributeUsage
Как упоминалось ранее, атрибут AttributeUsage определяет типы элементов, к которым может быть применен объявляемый атрибут. AttributeUsage — это, по существу, еще одно наименование класса System.AttributeUsageAttribute. У него имеется следующий конструктор: AttributeUsage(AttributeTargets validOn)
где validOn обозначает один или несколько элементов, к которым может быть приме нен объявляемый атрибут, тогда как AttributeTargets — перечисление, в котором определяются приведенные ниже значения. Аll Assembly Class Constructor Delegate Enum Event Field GenericParameter Interface Method Module Parameter Property ReturnValue Struct
Два этих значения или более можно объединить с помощью логической операции ИЛИ. Например, для указания атрибута, применяемого только к полям и свойствам, используются следующие значения. AttributeTargets.Field | AttributeTargets.Property
В классе атрибута AttributeUsage поддерживаются два именованных параметра. Первым из них является параметр AllowMultiple, принимающий логическое значе ние. Если это значение истинно, то атрибут может быть применен к одному и тому же элементу неоднократно. Второй именованный параметр, Inherited, также принимает логическое значение. Если это значение истинно, то атрибут наследуется производны ми классами, а иначе он не наследуется. По умолчанию параметр AllowMultiple при нимает ложное значение (false), а параметр Inherited — истинное значение (true).
В классе атрибута AttributeUsage определяется также доступное только для чте ния свойство ValidOn. Оно возвращает значение типа AttributeTargets, определя ющее типы элементов, к которым можно применять объявляемый атрибут. По умол чанию используется значение AttributeTargets.All. Атрибут Conditional
Атрибут 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 идентификатор]
где идентификатор обозначает конкретный идентификатор, определяющий усло вие выполнение метода. Данный атрибут может применяться только к методам. Если идентификатор определен, то метод выполняется, когда он вызывается. Если же иден тификатор не определен, то метод не выполняется.