Почему вы можете прочитать атрибут, помещенный в const, используя отражение в C #? - PullRequest
5 голосов
/ 17 февраля 2011

Я играю с отражением, и случайно понял, что могу поместить атрибут настраиваемого поля в переменную класса const, а затем (используя отражение) прочесть поля класса, найти const с атрибутом и выполнить действия.Это работает нормально.

Мне интересно, почему это работает нормально.Пока я не понял, как работают константы, я думал, что константы были «скомпилированы», и все ссылки на эту константу стали фактическим значением константы после компиляции.Если это так, то почему отражение все еще может видеть значения const?

Ответы [ 2 ]

11 голосов
/ 17 февраля 2011

Все ссылки на const компилируются, а не сама декларация const.Все объявления const передаются компилятором как часть IL.

Вот пример (обратите внимание, что IL сохраняет поле const).

C #:

class Foo
{
    const int i = 0;
}

IL:

.class private auto ansi beforefieldinit Foo
    extends [mscorlib]System.Object
{
    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed
    {
    }


    .field private static literal int32 i = int32(0)    
}
1 голос
/ 17 февраля 2011

Я думал, что константы были "скомпилированы", и все ссылки на эту константу стали фактическим значением константы после компиляции.Если это так

Я бы сказал, что это , а не .A const по-прежнему является полноценным членом своего класса.Рассмотрим библиотеку, которая предоставляет public const.Возможно, даже не будет каких-либо ссылок (в самой библиотеке), которые можно «скомпилировать».

...