我正在玩反射,偶然我意识到我可以将自定义字段属性放在 const 类变量上,然后(使用反射)我读取类的字段,找到具有该属性的常量并执行操作。这工作正常。
我很好奇为什么它能正常工作。除非我误解了 consts 的工作原理,否则我认为常量是“编译出来的”,并且对该常量的所有引用在编译后都变成了常量的实际值。如果是这样,为什么反射仍然可以看到 const 值?
最佳答案
所有对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)
}
关于c# - 为什么可以在 C# 中使用反射读取放置在 const 上的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032900/