Атрибуты в C#

Достаточно много времени до меня не доходило что же за такая штука эти Атрибуты.

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

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

Например с помощью атрибутов вы можете проанализировав их значения для типа построить различные схемы выполнения действий над ним.
Не очень понятно, тогда пример:

Есть арибут:

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];
     }
}


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

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

Данная статья даёт только общее и скудное описание атрибутов, но используя его, можно понять, что это такое.

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 13

    +3
    А где описание основных принципов аспектно ориентированного программирования? Было бы проще понят что такое аспект и с чем его едят.
      +8
      с чего вы взяли, что автор что-то знает об АОП?
        +4
        в таком случае будет совет автору почитать про АОП.
          +5
          Ждем статью от автора со срывом покровов про АОП?
        +1
        Аттрибуты — механизм языка.
        АОП — парадигма программирования.
        Стоит ли их смешивать в самом начале?

        habrahabr.ru/post/140842 — понравилась больше
          0
          Тогда возможно стоит начать с АОП, плюс показать небольшой пример реализации.
          0
          В данной статье я давал общее упрощённое понимание функционирования атрибутов. Аспектно ориентированное программирование конечно очень хорошая штука, но цель написания статьи была только в том чтобы дать начальное понимание для САМОСТОЯТЕЛЬНОГО углублённого изучения атрибутов (в случае необходимости или интереса).
          +9
          >.А теперь унаследовавшись от этого класса и задав новому классу другое значение атрибута при вызове метода мы получим массив нужной размерности.

          Из статьи вообще непонятно зачем нужны атрибуты, т.к. то же самое можно получить на порядок проще, исспользуя обычные переменные или параметры.
            +13
            Создается ощущение, что автор так и не понял, зачем нужны атрибуты.
              0
              АОП можно не затрагивать совсем в такой статье, но:
              В такой статье надо было еще написать о разных атрибутах для атрибутов, это немаловажный фактор. Еще примеры надо было привести, когда идет множественное применение атрибутов, как они могут наследоваться, как этим управлять. Подводные камни с атрибутами какие могут быть. И так далее по теме. А это даже не статья и не заметка, а писанина на полях тетрадки.

                0
                Значение атрибута невозможно изменять в процессе выполнения кода, так как значения их свойств хранятся в виде констант в скомпилированном модуле

                Очень интересно, как автор представляет себе хранение констант в скомпилированном модуле?
                  –1
                  Аргументы конструктора атрибута лежат в метаинформации (причём там ряд ограничений на то, что может быть его аргументом: числа, строки, TypeInfo) и передаются ему привызове GetCustomAttributes для сопоставленной сущности, причём при каждом вызове. Соответственно, очень проблематично повлиять на изменения логики поведения атрибута при дальнейших вызовах без поддержки со стороны кода самого атрибута.
                  0
                  Нуууу. Очень приятно что данная статья вызвала столько отзывов. Я даже не думал что кто-то настолько много может ожидать от первой статьи за хабре) Простите за мою короткую статью, но всё таки считаю что для начального понимания что такое Атрибут и как начать с ним работать её достаточно. На мой взгляд, прочитав подобную статью и не имея понятие что такое атрибут мне в разы легче было бы с ними разобраться. Я конечно же понимаю что все кто указал на недочёты в этой статье очень грамотные люди, которые пишут свои атрибуты и работают с ними буквально ежедневно. И разумеется, начальный пример стоило дать на примере какой нибудь программы для генерации разметки с кодом на 3 страницы с кучей XML разметки. Приношу свои глубочайшие извинения за то, что в начале статьи я не вставил красивую картинку :)

                  А теперь без шуток.

                  Я понял что ожидания от подобной статьи очень высокие и постараюсь, в одной из будущих статей раскрыть этот вопрос подробнее с учётом ваших пожеланий. К сожалению это потребует некоторого времени и работы с литературой для более или менее информативного поста с учётом всех запросов.

                  Only users with full accounts can post comments. Log in, please.