Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
My_shpory_Ivan_Ivanich (2).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
149.35 Кб
Скачать

8. Атрибуты, жизненный цикл объекта атрибута

Атрибут — это класс, унаследованный от базового класса Attribute. Суть атрибута в том, что он используется для генерации описаний. Создав атрибут вы можете наделить его своими свойствами которыми вы желаете наградить класс, поле, свойство или метод, Атрибут не влияет на значение полей и свойств и на выполнение методов класса, если в теле метода не учитывается информация хранящаяся в атрибуте. Но есть очень важный момент — Значение атрибута невозможно изменять в процессе выполнения кода, так как значения их свойств хранятся в виде констант в скомпилированном модуле 

Атрибуты обеспечивают эффективный способ связывания метаданных или декларативной информации с кодом (сборками, типами, методами, свойствами и т. д.). После того как атрибут будет связан с программной сущностью, он может быть запрошен во время выполнения с помощью техники, называемой рефлексией. Дополнительные сведения см. в разделе Отражение (C# и Visual Basic).

Атрибуты имеют следующие параметры.

  • Атрибуты добавляют в программу метаданные. Метаданные представляют собой сведения о типах, определенных в программе. Все сборки .NET содержат заданный набор метаданных, описывающих типы и члены типов, определенных в сборке. Для задания необходимых дополнительных сведений можно добавить атрибуты. Дополнительные сведения см. в разделе Создание настраиваемых атрибутов (C# и Visual Basic).

  • Один или несколько атрибутов могут применяться к сборкам, модулям или более мелким программным элементам, таким как классы и свойства.

  • Атрибуты могут принимать аргументы точно так же, как методы и свойства.

  • Программа может проверить собственные метаданные или метаданные в других программах с помощью рефлексии. Дополнительные сведения см. в разделе Обращение к атрибутам с помощью отражения (C# и Visual Basic).

Есть атрибут:

public class MyAttribute : Attribute

{

public int Count { get; set; }

}

И некий класс который мы наградим описанным атрибутом и будем использовать его значение для формирования результата функции GetArray:

[MyAttribute{ Count = 3 }]

public class IntArrayInitializer

{

public int[] GetArray()

{

var type = this.GetType();

if (Attribute.IsDefined(type, typeof(MyAttribute)))

{

var attributeValue = Attribute.GetCustomAttribute(type, typeof(MyAttribute)) as MyAttribute;

return new int[attributeValue.Count];

}

return new int[0];

}

}

9. Специальные атрибуты net.Framework и ограничения пользовательских атрибутов

Как только класс атрибута будет определен, атрибут можно присоединить к элементу. Атрибут указывается перед тем элементом, к которому он присоединяется, и для этого его конструктор заключается в квадратные скобки.

По умолчанию действие специальных атрибутов может распространяться на практически любой аспект кода (методы, классы, свойства и т.д.). В одних случаях подобное поведение оказывается именно тем, что нужно, но в других, однако, может потребоваться создать вместо этого специальный атрибут, действие которого бы распространялось только на избранные элементы кода. Чтобы ограничить область действия специального атрибута, необходимо применить к его определению атрибут [AttributeUsage]. Атрибут [AttributeUsage] позволяет предоставлять (посредством операции OR) любую комбинацию значений из перечисления AttributeTargets:

//В этом перечислении описаны целевые объекты, на которые распространяется действие атрибута.

public enum AttributeTargets

{

All, Assembly, Class, Constructor,

Delegate, Enum, Event, Field, GenericParameter,

Interface, Method, Module, Parameter,

Property, ReturnValue, Struct

}

Более того, атрибут [AttributeUsage] также позволяет дополнительно устанавливать свойство AllowMultiple, которое указывает, может ли атрибут применяться к одному и тому же элементу более одного раза (значением по умолчанию этого свойства является false). Помимо этого он также позволяет указывать, должен ли атрибут наследоваться производными классами, за счет применения именованного свойства Inherited (значением по умолчанию этого свойства является true).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]