Что на самом деле делает компилятор / CLR, когда атрибуты аннотируют тип / метод / свойство? - PullRequest
2 голосов
/ 04 марта 2011

Когда вы аннотируете тип, метод или свойство атрибутом, что такое компилятор / CLR / и т. Д. тебе делать?

Я предполагаю, что он "внедряет" методы, свойства и т. Д. В определения класса (или, может быть, просто в ваш объект? Или?) И обеспечивает автоматическое поведение, вроде как когда вы объявляете делегата кратким:

public delegate void MySuperSpecialDelegate(myAwesomeClass myAwesomeObject);

тогда вы получите действительно замечательное автоматическое поведение, которое «внедряется» в скомпилированный код (CIL) для вас.

Итак, чтобы повторить вопрос, что происходит автоматически "за кадром", когда вы используете атрибуты?

Ответы [ 2 ]

3 голосов
/ 04 марта 2011

Абсолютно ничего , с несколькими очень конкретными примерами:

  • PrincipalPermissionAttribute
  • MethodImplAttribute
  • и т.д.

с очень специфической обработкой

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

Есть некоторые, которые * компилятор использует , однако - ConditionalAttribute, SerializableAttribute и т. Д.

Но повторим, в общем случае и для подавляющего большинства атрибутов: ничего, ноль, zip, nada nix и ноль.

2 голосов
/ 04 марта 2011

Зависит от атрибута.

«Нормальные» атрибуты, такие как CLSCompliantAttribute не делать что-либо во время выполнения (если только вы не пытаетесь их прочитать, в этом случае они создаются); это просто метаданные, описывающие данные / код, которые иногда используются компилятором и / или отладчиком для помощи программисту.

«Специальные» атрибуты, ну, в общем, особенные. Они могут изменять флаги в коде, вызывать изменение поведения CLR или вызывать другие заметные изменения; это зависит от атрибута. (Например, FieldOffsetAttribute может привести к изменению макета поля, что, очевидно, является наблюдаемым эффектом времени выполнения.)

extreme пример изменения поведения можно увидеть с помощью ProxyAttribute , в этом случае вы можете в значительной степени перехватить весь код для класса (даже конструктора).

Другие примеры таких «специальных» атрибутов включают InAttribute, OutAttribute, ThreadStaticAttribute, MTAThreadAttribute, TypeForwardedToAttribute (I думаю ), ComImportAttribute, DllImportAttribute, и т. д., и т. п., на самом деле их довольно много!

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