stf*_*tfx 4 .net compilation const
为什么const
在编译时它们的值被替换为值,但是仍然包含在汇编中?至少这是IL DASM和Reflector所展示的.
目前我const
用于定义许多幻数和字符串,以便更容易地更改代码而不影响运行时性能.
现在我知道这不会影响已用内存,但它仍会影响编译的程序集大小,这对于手机应用程序来说至关重要.
另一个缺点是,在查看反汇编代码时,其他人更容易理解幻数.
我真的很感兴趣为什么编译器(Mono和.NET)完全这样做?
此行为在ECMA-335标准中指定(其中.NET和Mono都是实现).引用第II.22.9节"常数":
请注意,
Constant
信息不会直接影响运行时行为,尽管它通过Reflection可见(因此可用于实现诸如提供的功能System.Enum.ToString
).编译器在编译时在导入元数据时检查此信息,但常量本身的值(如果使用)将嵌入到编译器发出的CIL流中.Constant
在运行时没有CIL指令来访问表.
也就是说,const
值是"内联的"(可能是因为它们可能是出于性能原因),但仍保留在元数据中,因此编译器和工具可以对它们进行检查.
如果没有const
为字段的-ness 发出元数据,这将产生这些后果(可能还有其他 - 这只是两个例子):
const
字段.System.Reflection
,则无法再使用该FieldInfo.IsLiteral
属性. 归档时间: |
|
查看次数: |
131 次 |
最近记录: |