Andriy Shyrokoryadov

.Net developer, data scientist

Что такое атрибуты - вопрос №10 на собеседование C# / .NET

Текст к видео "Что такое атрибуты" на канале YouTube

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

Атрибуты могут быть добавлены к различным частям кода: к декларациям классов, методам, свойствам, аргументам. Следует понимать, что код будет отлично выполняться и без атрибутов, однако если атрибуты будут добавлены, то пользователи нашего кода смогут обнаружить эти атрибуты и предпринять определенные действия в зависимости от значения атрибутов. Если код содержит атрибуты, однако ничто не проверяет их значение, то код будет выполняться, как если бы атрибутов не было. Атрибуты сами по себе пассивны – они не выполняются, как код, а только содержат значения, которые мы можем использовать для управления работой кода.

Как программисты могут определить есть ли в коде атрибуты не имея доступ к исходному коду. Для этих целей используется рефлексия. Рефлексия – это процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения. Одной из функций рефлексии является чтение атрибутов. Используя рефлексию, можно определить есть ли в данном месте (в декларации класса, метода, свойства, аргумента) атрибут определенного типа и если да, то получить объект атрибута данного типа, через который мы получаем доступ к значениям данных атрибута.

Где атрибуты встречаются наиболее часто:

  • в модульных тестах: атрибуты определяют в какой последовательности должен выполняться код модульных тестов и что конкретно должно выполняться во время тестирования. Например, мы можем обозначить атрибутом метод, который должен выполняться перед модульным тестом – для инициализации первичных значений переменных в тесте.
  • в коде связанным с управлением сериализацией и десериализацией. Сериализация это перевод данных программы в последовательность битов, а десериализация это обратный процесс. Используя атрибуты, мы можем управлять эти процессом. Код, который выполняет сериализацию / десериализацию ищет все атрибуты связанные с сериализацией и в зависимости от их значения предпринимает определенные действия, которые влияют на конечный результат сериализации.
  • в ASP.NET MVC атрибуты используются для определения валидации на свойства классов – моделей.

Что еще можно сказать об атрибутах? К одному члену можно приписать не только один, а даже несколько атрибутов. Можно также ограничить использование атрибутов только для определенных членов – например атрибут только для классов или только для свойств.