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