.NET const影响编译的程序集大小

stf*_*tfx 4 .net compilation const

为什么const在编译时它们的值被替换为值,但是仍然包含在汇编中?至少这是IL DASM和Reflector所展示的.

目前我const用于定义许多幻数和字符串,以便更容易地更改代码而不影响运行时性能.

现在我知道这不会影响已用内存,但它仍会影响编译的程序集大小,这对于手机应用程序来说至关重要.

另一个缺点是,在查看反汇编代码时,其他人更容易理解幻数.

我真的很感兴趣为什么编译器(Mono和.NET)完全这样做?

sta*_*ica 6

此行为在ECMA-335标准中指定(其中.NET和Mono都是实现).引用第II.22.9节"常数":

请注意,Constant信息不会直接影响运行时行为,尽管它通过Reflection可见(因此可用于实现诸如提供的功能System.Enum.ToString).编译器在编译时在导入元数据时检查此信息,但常量本身的值(如果使用)将嵌入到编译器发出的CIL流中.Constant在运行时没有CIL指令来访问表.

也就是说,const值是"内联的"(可能是因为它们可能是出于性能原因),但仍保留在元数据中,因此编译器和工具可以对它们进行检查.

如果没有const为字段的-ness 发出元数据,这将产生这些后果(可能还有其他 - 这只是两个例子):

  • 像Reflector这样的编译器或工具无法再区分常规字段和const字段.
  • 如果您使用了该字段System.Reflection,则无法再使用该FieldInfo.IsLiteral属性.