假设您使用 C#、VB.NET 或任何使用 .NET 的语言编写应用程序。 当你点击构建时,它真的会编译你的代码吗?我是这么认为的,直到我开始在我的一些程序集上使用 Redgate 的反射器并逐字查看我的代码。我本来希望展开循环并进行大量优化,但什么也没有。
那么编译什么时候真正发生呢?我认为当它被构建时,代码变成CIL(中间语言)并且当执行发生时,它正在加载到CLR中?它是否仅在 CLR 期间进行优化,而从未在构建时进行优化?
当你在VS中编译时
执行时:
我也在这里发布答案,因为另一个问题与此无关......
它在编译时编译为 IL。 Reflector 的神奇之处在于它“理解”IL 并将其转换回 c#(或 VB.NET 或其他语言。查看 Reflector 中的“选项”菜单,您可以查看任何格式的程序集,包括 IL)。
在 Reflector 中,您实际上看不到原始代码。您正在看到 IL 到 c# 的翻译。大多数时候,这与您所写的非常相似,但有一些明显的迹象 - 例如,找到一个实现了 auto-property:
的地方string MyProperty {get;set;}
你会看到实际编译的结果,如下所示:
public string MyProperty
{
[CompilerGenerated]
get
{
return this.<MyProperty>k__BackingField;
}
[CompilerGenerated]
set
{
this.<MyProperty>k__BackingField = value;
}
}