为什么你能在C#中使用反射读取置于const上的属性?

Kal*_*exx 5 c# reflection constants

我正在玩反射,偶然我意识到我可以在const类变量上放置一个自定义字段属性,然后(使用反射)我读取类的字段,找到带有属性的const并执行操作.这工作正常.

我很好奇为什么它工作正常.除非我误解了consts是如何工作的,否则我认为常量被"编译出来",所有对该常量的引用在编译后成为常量的实际值.如果是这种情况,为什么反射仍然可以看到const值?

And*_*are 11

所有对a 的引用const都被编译掉了 - 而不是const声明本身.任何const声明都由编译器作为IL的一部分发出.

这是一个例子(注意IL保留了该const字段).

C#:

class Foo
{
    const int i = 0;
}
Run Code Online (Sandbox Code Playgroud)

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)    
}
Run Code Online (Sandbox Code Playgroud)