ConditionalAttribute и другие специальные классы - PullRequest
6 голосов
/ 16 июня 2011

ConditionalAttribute может использоваться для удаления вызовов отмеченного метода в зависимости от определенных символов компилятора. Я предполагаю, что мы не могли бы создать этот класс сами, так как компилятор должен искать его специально.

Мне было интересно, какие еще существуют классы, используемые компилятором или языком, которые мы не могли бы кодировать сами.

Ответы [ 3 ]

6 голосов
/ 16 июня 2011

в дополнение к упомянутым;

AttributeUsageAttribute

имеет специальную поддержку компилятора, поскольку она ограничивает (при компиляции), как вы можете применять атрибуты

ObsoleteAttribute

также используется компилятором для предупреждения или ошибки использования.

Я подозреваю , однако, технически вы могли бы написать все это самостоятельно - до тех пор, пока вы пишете свои собственные библиотеки libarary и System.dll; p Компилятор обычно ищет шаблон / подпись , так как он должен обслуживать разные среды выполнения - и действительно, вам не нужно использовать основные библиотеки MS. Однако поведение определяется компилятором, а не классом, поэтому вы не можете заставить его делать что-то другое.

4 голосов
/ 16 июня 2011
  • Компилятор ищет [ExtensionAttribute] для указания методов расширения (и классов, содержащих методы расширения).

  • [DynamicAttribute] используется для указания того, что элемент должен рассматриваться как тип dynamic (даже если сам тип элемента будет просто object)

  • [InternalsVisibleTo] позволяет одной сборке получить доступ к внутренним элементам другой.

По сути, просмотрите пространство имен System.Runtime.CompilerServices и изучите там атрибуты ... многие из них будут обрабатываться специально компилятором, даже если это не C # компилятор (например, DateTimeConstantAttribute не используется компилятором C #, насколько мне известно, но DecimalConstantAttribute это. Это возможно , что Компилятор C # будет потреблять константы DateTime значений, даже если он их не выдаст ...)

0 голосов
/ 16 июня 2011

[SerializableAttribute] приходит на ум.Компилятор обрабатывает это по-разному для других атрибутов, я полагаю, что он переведен в конкретную инструкцию в IL ..

EDIT Если рассматривать пример IL для ArgumentException, определение класса выглядит следующим образом:

.class public auto ansi serializable beforefieldinit ArgumentException

Обратите внимание на модификатор * serializable.Обычно с атрибутом вы ожидаете увидеть что-то вроде следующего, но его там нет:

.custom instance void System.SerializableAttribute::.ctor() = (
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...