Атрибуты C# и импликация Метаданных

Я прочитал учебные руководства из сети об Атрибутах C# и Метаданных. Это очень прохладно, но я задаюсь вопросом его импликация.

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

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

  3. Действительно ли возможно иметь атрибуты времени компиляции? Т.е. атрибуты будут только применены, если ОТЛАДКА будет определена?

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

#if DEBUG
[MyCustomAttribute]
#endif

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

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

Спасибо!

- Stephanus

8
задан tep 24 March 2010 в 15:57
поделиться

3 ответа

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

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

6
ответ дан 5 December 2019 в 12:57
поделиться

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

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

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

4
ответ дан 5 December 2019 в 12:57
поделиться
  1. Атрибуты загружаются при загрузке сборки. Они являются частью информации о типе, поэтому загружаются вместе с типами автоматически.
  2. Существует (очень небольшая) стоимость в плане размера сборки с атрибутами. Однако это очень незначительно, и я бы не стал беспокоиться.
  3. Вы можете сделать это, но только так, как вы показали.
  4. Наличие атрибутов не влияет на производительность. Они игнорируются во время выполнения, если только отражение не используется для явного запроса атрибутов.
3
ответ дан 5 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: