С# — Атрибуты
атрибут — это декларативный тег, который используется для передачи информации во время выполнения о поведении различных элементов, таких как классы, методы, структуры, перечислители, сборки и т. д. в вашей программе. Вы можете добавить в программу декларативную информацию с помощью атрибута. Декларативный тег обозначается квадратными скобками ([ ]) над элементом, для которого он используется.
Атрибуты используются для добавления в программу метаданных, таких как инструкции компилятора, и другой информации, такой как комментарии, описание, методы и классы. .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