System.Exception 2 страница
17.1 Классы атрибутов; Класс, который прямо или косвенно производится от абстрактного класса System.Attribute, является классом атрибута. Объявление класса атрибута определяет новый вид атрибута;, который можно поместить в объявлении. Классы атрибутов принято именовать с помощью суффикса Attribute. При использовании атрибута суффикс может оставаться или опускаться. 17.1.1 Использование атрибутов Атрибут AttributeUsage (§17.4.1) применяется для описания, как использовать класс атрибута. Атрибут AttributeUsage имеет позиционный параметр (§17.1.2), позволяющий классу атрибута указать те виды объявлений, в которых можно использовать атрибут. Например: using System; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)] В этом примере определяется класс атрибута с именем SimpleAttribute, который можно помещать только в объявления_классов и объявления_интерфейсов. Например: [Simple] class Class1 {...} [Simple] interface Interface1 {...} показано несколько возможностей использования атрибута Simple. Хотя этот атрибут определен с именем SimpleAttribute, при его использовании можно опускать суффикс Attribute, то есть пользоваться коротким именем Simple. Таким образом, приведенный выше пример семантически эквивалентен следующему: [SimpleAttribute] class Class1 {...} [SimpleAttribute] interface Interface1 {...} Атрибут AttributeUsage имеет именованный параметр (§17.1.2), называемый AllowMultiple, который указывает, можно ли задать атрибут более одного раза для данной сущности. Если параметр AllowMultiple для класса атрибута имеет значение True, то этот класс атрибута является классом атрибута многократного использования и его можно указывать для сущности более одного раза. Если параметр AllowMultiple для класса атрибута имеет значение False, то этот класс атрибута является классом атрибута однократного использования; и его можно указывать для сущности не более одного раза. Например: using System; [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] public AuthorAttribute(string name) { public string Name { определен класс атрибута многократного использования с именем AuthorAttribute. Например: [Author("Brian Kernighan"), Author("Dennis Ritchie")] показано объявление класса с двумя использованиями атрибута Author. Атрибут AttributeUsage имеет другой именованный параметр, называемый Inherited, который указывает, наследуется ли указанный для базового класса атрибут также классами, производными от этого базового класса. Если параметр Inherited для класса атрибута имеет значение True, этот атрибут наследуется. Если параметр Inherited для класса атрибута имеет значение False, этот атрибут не наследуется. Если параметр не установлен, его значение по умолчанию True. Класс атрибута X, не имеющий вложенного в него атрибута AttributeUsage, как в следующем примере: using System; class X: Attribute {...} эквивалентен следующему: using System; [AttributeUsage( 17.1.2 Позиционные и именованные параметры Классы атрибутов могут иметь позиционные параметры и именованные параметры. Каждый открытый конструктор экземпляров для класса атрибута определяет допустимую последовательность позиционных параметров для этого класса атрибута. Каждое не статическое, общее, доступное на чтение и запись поле и свойство для класса атрибута определяет именованный параметр для класса атрибута. Пример: using System; [AttributeUsage(AttributeTargets.Class)] public string Topic { // Named parameter public string Url { Здесь определяется класс атрибута с именем HelpAttribute, имеющий один позиционный параметр url и один именованный параметр Topic. Хотя свойство Url не статическое и общее, оно не определяет именованный параметр, так как не является доступным для чтения и записи. Этот класс атрибута можно использовать следующим образом: [Help("http://www.mycompany.com/.../Class1.htm")] [Help("http://www.mycompany.com/.../Misc.htm", Topic = "Class2")] 17.1.3 Типы параметров атрибута Типы позиционных и именованных параметров для класса атрибута ограничены типами параметров атрибута;, к которым относятся: · один из следующих типов: bool, byte, char, double, float, int, long, sbyte, short, string, uint, ulong и ushort; · тип object; · тип System.Type; · перечисляемый тип, если и он имеет общую доступность, и типы, в которые он вложен (если вложен), также имеют общую доступность (§17.2); · одномерные массивы указанных выше типов. Аргумент конструктора или общее поле, которые не имеют один из этих типов, не могут использоваться в качестве позиционных или именованных параметров в спецификации атрибута. 17.2 Спецификация атрибута; Спецификация атрибута — это применение предварительно определенного атрибута к объявлению. Атрибут является частью дополнительных декларативных сведений, задаваемых для объявления. Атрибуты могут задаваться в глобальной области видимости (чтобы задать атрибуты для содержащей сборки или модуля) и для объявлений_типов (§9.6), объявлений_членов_класса (§10.1.5), объявлений_членов_интерфейса (§13.2), объявлений_членов_структуры (§11.2), объявлений_членов_перечисления (§14.3), объявлений_методов_доступа (§10.7.2), объявлений_метода_доступа_к_событиям (§10.8.1) и списков_формальных_параметров (§10.6.1). Атрибуты задаются в разделах атрибутов. Раздел атрибутов состоит из пары квадратных скобок, которые окружают список из одного или более атрибутов, разделенных запятыми. Порядок указания атрибутов в таком списке и порядок размещения разделов, вложенных в одну и ту же программную сущность, не имеет значения. Например, спецификации атрибутов [A][B], [B][A], [A, B] и [B, A] эквивалентны. глобальные_атрибуты: разделы_глобальных_атрибутов: раздел_глобальных_атрибутов:
|