Атрибуты C # и значение метаданных - PullRequest
8 голосов
/ 24 марта 2010

Я читаю учебники из Интернета об атрибутах и ​​метаданных C #. Это очень круто, но мне интересно его значение.

  1. Загружаются ли (пользовательские) атрибуты при загрузке сборки? или это только когда вы используете отражение для получения метаданных?

  2. Кажется, что атрибуты добавляют к общему размеру кода, потому что он компилируется в исполняемый файл? Это правильно?

  3. Возможно ли иметь атрибуты времени компиляции? То есть атрибуты будут применяться только если определен DEBUG?

Я знаю, что нужно сделать так:

#if DEBUG
[MyCustomAttribute]
#endif

Но мне интересно, есть ли лучший способ?

  1. Есть ли какие-либо проблемы с производительностью / памятью при использовании большого количества атрибутов? Моя целевая платформа будет Xbox 360 (с использованием C # / XNA).

Спасибо!

-Stephanus

Ответы [ 3 ]

6 голосов
/ 24 марта 2010

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

Ничего не происходит, пока вы не используете метод GetCustomAttributes (). Затем код класса атрибута компилируется точно в срок, как обычный код в вашей сборке. И конструктор, и установщики свойств вызываются с использованием данных атрибута в метаданных. Вы будете использовать некоторое количество оперативной памяти для обоих случаев, когда диспетчер памяти отображает IL, машинный код и страницы метаданных.

4 голосов
/ 24 марта 2010

1) Атрибуты AFAIK создаются с отложенным доступом, но они приходят со сборкой в ​​память.
2) Не достаточно близко, чтобы беспокоиться. Кнут и др.
3) Да.

Использование атрибутов означает использование отражения, которое входит в число самых медленных вещей, которые вы можете делать в фреймворке. Но тогда, это слишком медленно для вашего приложения? Не зная, что вы делаете, не говоря уже о том, что вам нужно сделать в течение нескольких миллисекунд, никто не может дать вам ответ «да» или «нет».

Лучше всего создать прототип и посмотреть, как он выглядит в IRL. Опять Кнут и т. Д.

3 голосов
/ 24 марта 2010
  1. Атрибуты загружаются при загрузке сборки. Они являются частью информации о типе, поэтому автоматически загружаются с типами.
  2. Существует (очень маленькая) стоимость с точки зрения размера сборки с атрибутами. Тем не менее, это очень незначительно, и меня это не касается.
  3. Вы можете сделать это, но только так, как вы показываете.
  4. Нет влияния на производительность наличия атрибутов. Они игнорируются во время выполнения, если только отражение не используется для явного запроса атрибутов.
...