Я прочитал учебные руководства из сети об Атрибутах C# и Метаданных. Это очень прохладно, но я задаюсь вопросом его импликация.
(Пользовательские) атрибуты загружаются, когда блок загружается? или это только при использовании отражения для получения метаданных?
Кажется, что атрибуты добавляют к общему количеству размера кода, потому что это компилируется в в исполняемый файл? Действительно ли это правильно?
Действительно ли возможно иметь атрибуты времени компиляции? Т.е. атрибуты будут только применены, если ОТЛАДКА будет определена?
Я знаю, что нужно сделать как это:
#if DEBUG
[MyCustomAttribute]
#endif
Но интересно, существует ли лучший путь?
Спасибо!
- Stephanus
Атрибуты состоят из двух частей: их код, их аргумент конструктора и данные свойства. Код хранится в IL сборки, данные хранятся в метаданных сборки. Если атрибут не используется, он занимает лишь некоторое пространство виртуальной памяти, но не требует ресурсов компьютера.
Ничего не произойдет, пока вы не воспользуетесь методом GetCustomAttributes (). Затем код для класса атрибута компилируется точно в срок, как и обычный код в вашей сборке. И вызываются конструктор и установщики свойств, используя данные атрибута в метаданных. Вы израсходуете некоторое количество ОЗУ для обоих случаев, когда диспетчер памяти отображает IL, машинный код и страницы метаданных.
1) Атрибуты AFAIK создаются лениво, но они поступают вместе со сборкой в память.
2) Недостаточно близко, чтобы беспокоиться. Кнут и др.
3) Да.
Использование атрибутов означает использование отражения, которое входит в число самых медленных вещей, которые вы можете делать в структуре. Но разве это не слишком медленно для вашего приложения? Не зная, что вы делаете, не говоря уже о том, что вам нужно сделать за сколько миллисекунд, никто не может дать вам ответ «да» или «нет».
Лучше всего создать прототип и посмотреть, на что он похож. Опять же, Кнут и т. Д.