System.Exception 4 страница
· атрибут, заданный в объявлении метода доступа get для объявления свойства или индексатора, может применяться либо к связанному методу, либо к его возвращаемому значению. При отсутствии описателя_целевого_объекта_атрибута; атрибут применяется к методу. Наличие описателя_целевого_объекта_атрибута; method указывает, что атрибут применяется к методу; наличие описателя_целевого_объекта_атрибута; return указывает, что атрибут применяется к возвращаемому значению; · атрибут, указанный в объявлении метода доступа set для объявления свойства или индексатора, может применяться либо к связанному методу, либо к его одиночному неявному параметру. При отсутствии описателя_целевого_объекта_атрибута; атрибут применяется к методу. Наличие описателя_целевого_объекта_атрибута; method указывает, что атрибут применяется к методу; наличие описателя_целевого_объекта_атрибута; param указывает, что атрибут применяется к параметру; наличие описателя_целевого_объекта_атрибута; return указывает, что атрибут применяется к возвращаемому значению; · атрибут, заданный в объявлении метода доступа add или remove для объявления события, может применяться или к связанному методу, или к его одиночному параметру. При отсутствии описателя_целевого_объекта_атрибута; атрибут применяется к методу. Наличие описателя_целевого_объекта_атрибута; method указывает, что атрибут применяется к методу; наличие описателя_целевого_объекта_атрибута; param указывает, что атрибут применяется к параметру; наличие описателя_целевого_объекта_атрибута; return указывает, что атрибут применяется к возвращаемому значению. В других контекстах включение описателя_целевого_объекта_атрибута; разрешено, но излишне. Например, объявление класса может или включать, или опускать описатель type: [type: Author("Brian Kernighan")] [Author("Dennis Ritchie")] Является ошибкой задание недопустимого описателя_целевого_объекта_атрибута;. Например, описатель param нельзя использовать в объявлении класса: [param: Author("Brian Kernighan")] // Error Классы атрибутов принято именовать с помощью суффикса Attribute. Имя_атрибута; вида имя_типа; может или включать, или опускать этот суффикс. Если обнаружен класс атрибута и с этим суффиксом, и без суффикса, эта неоднозначность приводит к ошибке времени компиляции. Если имя_атрибута записывается таким образом, что его самый правый идентификатор является буквальным идентификатором (§2.4.2), то сопоставляется только атрибут без суффикса, позволяя таким образом разрешить неоднозначность. Например: using System; [AttributeUsage(AttributeTargets.All)] [AttributeUsage(AttributeTargets.All)] [X] // Error: ambiguity [XAttribute] // Refers to XAttribute [@X] // Refers to X [@XAttribute] // Refers to XAttribute Здесь показаны два класса атрибутов с именами X и XAttribute. Атрибут [X] является неоднозначным, так как он может ссылаться или на X, или на XAttribute. Использование буквального идентификатора позволяет указать точное намерение в таких редких случаях. Атрибут [XAttribute] не является неоднозначным (хотя он мог бы им быть, если бы имелся класс атрибута с именем XAttributeAttribute). Если удаляется объявление для класса X, то оба атрибута ссылаются на класс атрибута с именем XAttribute, как это показано в следующем примере: using System; [AttributeUsage(AttributeTargets.All)] [X] // Refers to XAttribute [XAttribute] // Refers to XAttribute [@X] // Error: no attribute named "X" Использование класса атрибута одноразового использования более одного раза для одной и той же сущности является ошибкой времени компиляции. Например: using System; [AttributeUsage(AttributeTargets.Class)] public HelpStringAttribute(string value) { public string Value { [HelpString("Description of Class1")] В результате возникает ошибка времени компиляции, так как предпринимается попытка использования HelpString, который является классом атрибута одноразового использования, более одного раза в объявлении Class1. Выражение E является выражением_аргумента_атрибута, если верны все следующие утверждения: · тип E — это тип параметра атрибута (§17.1.3); · во время компиляции значение E может быть разрешено в одно из следующего: o постоянное значение; o объект System.Type; o одномерный массив выражений_аргумента_атрибута;. Пример: using System; [AttributeUsage(AttributeTargets.Class)] public Type P2 { public object P3 { [Test(P1 = 1234, P3 = new int[] {1, 3, 5}, P2 = typeof(float))] Выражение_typeof (§7.6.11), используемое в качестве выражения аргумента атрибута, может ссылаться на неуниверсальный тип, закрытый сконструированный тип или на несвязанный универсальный тип, но не может ссылаться на открытый тип. Это обеспечивает возможность разрешения выражения во время компиляции. class A: Attribute class G<T> class X 17.3 Экземпляры атрибутов; Экземпляр атрибута; — это экземпляр, представляющий атрибут во время выполнения. Атрибут определяется с помощью класса атрибута, позиционных аргументов и именованных аргументов. Экземпляр атрибута — это экземпляр класса атрибута, который инициализируется с помощью позиционных и именованных аргументов. Извлечение экземпляра атрибута включает обработку как во время компиляции, так и во время выполнения, как описано в следующих разделах. 17.3.1 Компиляция атрибута; Компиляция атрибута; с классом атрибута T, списком_позиционных_аргументов; P и списком_именованных_аргументов; N состоит из следующих шагов: · выполнение шагов обработки времени компиляции для компиляции выражения_создания_объекта вида new T(P). Результатом этих шагов является или ошибка времени компиляции, или определение конструктора экземпляров C для T, который может быть вызван во время выполнения;
|