С# — Атрибуты
атрибут — это декларативный тег, который используется для передачи информации во время выполнения о поведении различных элементов, таких как классы, методы, структуры, перечислители, сборки и т. д. в вашей программе. Вы можете добавить в программу декларативную информацию с помощью атрибута. Декларативный тег обозначается квадратными скобками ([ ]) над элементом, для которого он используется.
Атрибуты используются для добавления в программу метаданных, таких как инструкции компилятора, и другой информации, такой как комментарии, описание, методы и классы. .Net Framework предоставляет два типа атрибутов:предопределенные атрибуты и настраиваемые атрибуты.
Указание атрибута
Синтаксис для указания атрибута следующий:
[attribute(positional_parameters, name_parameter = value, ...)] element
Имя атрибута и его значения указываются в квадратных скобках перед элементом, к которому применяется атрибут. Позиционные параметры указывают основную информацию, а параметры имени указывают дополнительную информацию.
Предопределенные атрибуты
.Net Framework предоставляет три предопределенных атрибута —
- Использование атрибута
- Условно
- Устарело
Использование атрибута
Предопределенный атрибут AttributeUsage описывает, как можно использовать пользовательский класс атрибутов. Он определяет типы элементов, к которым может применяться атрибут.
Синтаксис для указания этого атрибута следующий —
[AttributeUsage ( validon, AllowMultiple = allowmultiple, Inherited = inherited )]
Где,
-
Параметр validon указывает языковые элементы, на которые может быть помещен атрибут. Это комбинация значений перечислителя AttributeTargets. . Значение по умолчанию: AttributeTargets.All. .
-
Параметр allowmultiple (необязательно) предоставляет значение для AllowMultiple свойство этого атрибута, логическое значение. Если это правда, атрибут является многоразовым. По умолчанию установлено значение false (одноразовое использование).
-
Параметр inherited (необязательный) предоставляет значение для Inherited свойство этого атрибута, логическое значение. Если это правда, атрибут наследуется производными классами. Значение по умолчанию — false (не наследуется).
Например,
[AttributeUsage( AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
Условно
Этот предопределенный атрибут помечает условный метод, выполнение которого зависит от указанного идентификатора предварительной обработки.
Вызывает условную компиляцию вызовов методов в зависимости от указанного значения, например Debug. или Отследить . Например, он отображает значения переменных при отладке кода.
Синтаксис для указания этого атрибута следующий —
[Conditional( conditionalSymbol )]
Например,
[Conditional("DEBUG")]
В следующем примере демонстрируется атрибут —
Живая демонстрация#define DEBUG using System; using System.Diagnostics; public class Myclass { [Conditional("DEBUG")] public static void Message(string msg) { Console.WriteLine(msg); } } class Test { static void function1() { Myclass.Message("In Function 1."); function2(); } static void function2() { Myclass.Message("In Function 2."); } public static void Main() { Myclass.Message("In Main function."); function1(); Console.ReadKey(); } }
Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —
In Main function In Function 1 In Function 2
Устарело
Этот предопределенный атрибут помечает программный объект, который не следует использовать. Это позволяет вам сообщить компилятору об отбрасывании определенного целевого элемента. Например, когда в классе используется новый метод и вы все еще хотите сохранить в классе старый метод, вы можете пометить его как устаревший, отобразив сообщение о том, что вместо старого метода следует использовать новый метод.
Синтаксис для указания этого атрибута следующий —
[Obsolete ( message )] [Obsolete ( message, iserror )]
Где,
-
Параметр сообщение , представляет собой строку, описывающую причину, по которой элемент устарел, и что использовать вместо него.
-
Параметр iserror , является логическим значением. Если его значение равно true, компилятор должен интерпретировать использование элемента как ошибку. Значение по умолчанию — false (компилятор выдает предупреждение).
Следующая программа демонстрирует это —
using System; public class MyClass { [Obsolete("Don't use OldMethod, use NewMethod instead", true)] static void OldMethod() { Console.WriteLine("It is the old method"); } static void NewMethod() { Console.WriteLine("It is the new method"); } public static void Main() { OldMethod(); } }
Когда вы пытаетесь скомпилировать программу, компилятор выдает сообщение об ошибке —
Don't use OldMethod, use NewMethod instead
Создание пользовательских атрибутов
.Net Framework позволяет создавать настраиваемые атрибуты, которые можно использовать для хранения декларативной информации и извлекать во время выполнения. Эта информация может быть связана с любым целевым элементом в зависимости от критериев проектирования и потребностей приложения.
Создание и использование настраиваемых атрибутов включает четыре шага —
- Объявление пользовательского атрибута
- Создание пользовательского атрибута
- Применить настраиваемый атрибут к целевому элементу программы
- Доступ к атрибутам через отражение
Последний шаг включает в себя написание простой программы для чтения метаданных для поиска различных обозначений. Метаданные — это данные о данных или информации, используемые для описания других данных. Эта программа должна использовать отражения для доступа к атрибутам во время выполнения. Об этом мы поговорим в следующей главе.
Объявление пользовательского атрибута
Новый настраиваемый атрибут должен быть получен из System.Attribute. учебный класс. Например,
//a custom attribute BugFix to be assigned to a class and its members [AttributeUsage( AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute
В предыдущем коде мы объявили настраиваемый атрибут с именем DeBugInfo. .
Создание пользовательского атрибута
Давайте создадим собственный атрибут с именем DeBugInfo. , в котором хранится информация, полученная при отладке любой программы. Пусть он хранит следующую информацию —
- Код ошибки
- Имя разработчика, выявившего ошибку
- Дата последней проверки кода
- Строковое сообщение для хранения замечаний разработчика.
Информация об ошибках класс имеет три частных свойства для хранения первых трех сведений и общедоступное свойство для хранения сообщения. Следовательно, номер ошибки, имя разработчика и дата проверки являются позиционными параметрами класса DeBugInfo, а сообщение является необязательным или именованным параметром.
Каждый атрибут должен иметь хотя бы один конструктор. Позиционные параметры должны быть переданы через конструктор. Следующий код показывает DeBugInfo класс —
//a custom attribute BugFix to be assigned to a class and its members [AttributeUsage( AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute { private int bugNo; private string developer; private string lastReview; public string message; public DeBugInfo(int bg, string dev, string d) { this.bugNo = bg; this.developer = dev; this.lastReview = d; } public int BugNo { get { return bugNo; } } public string Developer { get { return developer; } } public string LastReview { get { return lastReview; } } public string Message { get { return message; } set { message = value; } } }
Применение пользовательского атрибута
Атрибут применяется путем размещения его непосредственно перед целью —
[DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "Return type mismatch")] [DeBugInfo(49, "Nuha Ali", "10/10/2012", Message = "Unused variable")] class Rectangle { //member variables protected double length; protected double width; public Rectangle(double l, double w) { length = l; width = w; } [DeBugInfo(55, "Zara Ali", "19/10/2012", Message = "Return type mismatch")] public double GetArea() { return length * width; } [DeBugInfo(56, "Zara Ali", "19/10/2012")] public void Display() { Console.WriteLine("Length: {0}", length); Console.WriteLine("Width: {0}", width); Console.WriteLine("Area: {0}", GetArea()); } }
В следующей главе мы извлечем информацию об атрибутах, используя объект класса Reflection.
Язык C