Какие на самом деле «Атрибуты»?

1

Я уже много читал об атрибутах, и я довольно много знаю о них.

Но одно, что я не могу понять, это: "На самом деле?"

Я имею в виду, если это не наследование или реализация интерфейса или другие понятные концепции ООП, так что это за концепция?

что происходит за сценой при использовании и атрибуте для класса или члена класса?

Я прочитал другие связанные сообщения на этом сайте. Но они не дают много информации о том, что на самом деле происходит. Они больше касаются использования атрибутов. И непонятное объяснение того, что они на самом деле. В другом посте это то, что объявляет их: "Метаданные. Данные о ваших объектах/методах/свойствах". который не уточняет понятия

  • 0
    Может быть, лучше дубликат: .NET: Что такое атрибуты?
  • 0
    Я не уверен, что это дубликаты; вопрос здесь явно о том, что происходит за кулисами.
Показать ещё 5 комментариев
Теги:
attributes

2 ответа

2
Лучший ответ

Это просто метаданные, хранящиеся в базовом определении (не экземпляре) этого типа. Например, если я это сделаю:

[Description("some text")]
public string Name {get;set;}

то тот факт, что DescriptionAttribute с description конструктора-параметра "some text" - Name "some text" хранится в IL против собственности Name. Это не влияет на стоимость каждого экземпляра, и он ничего не делает сам по себе. Единственный раз, когда эти данные используются, - если код явно задает время выполнения:

  • "Какие дополнительные метаданные атрибутов вы имеете против Name?"
  • Name есть атрибут DescriptionAttribute?"
  • "пожалуйста, создайте мне DescriptionAttribute хранящийся против Name, если один из них"

а затем делает что-то с результатом.

CAVEAT: есть некоторые атрибуты, которые обрабатываются по-разному с помощью компилятора и/или CLI и выполняются по-разному. [Serializable], например, становится флагом IL-типа, а не атрибутом IL, но среда выполнения перемещает его так, что API-интерфейсы сообщают об этом, как если бы это было другое.

1

Атрибуты - очень простая концепция, но они усложняются тем фактом, что так много частей рамки используют их способами, которые кажутся магии.

Атрибуты - это не что иное, как метаданные. То есть, они по сути являются комментариями, которые структура может читать во время выполнения, которые описывают вещи о типе. Существуют всевозможные атрибуты, предназначенные для различных целей, и существует различный код, который ищет эти атрибуты.

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

Классы атрибутов могут быть созданы, а затем код в них может быть выполнен, но опять же, только если какой-либо другой код запрашивает его. Большая часть этого кода часто скрывается фреймворками. Например, в MVC есть атрибуты, используемые для объявления методов как Post или Get... или что метод должен быть аутентифицирован до его вызова... Эти атрибуты полезны только потому, что структура MVC имеет код для проверки их, и принять меры на их основе.

Короче говоря, атрибут ничего не делает сам по себе. Он работает только в сочетании с другим кодом (обычно в рамках), который его использует. Таким образом, атрибуты могут быть почти тем, что может придумать каждый.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню