1

如果我有一个没有操作但返回传入参数的方法,编译器会将其从生成的 MSIL 中删除吗?

例如:

public partial class StringResource {

    /// <summary>About</summary>
    public static string About { get { return Encode(Resources.WebUI.About); } }

    public static string Encode(string s) { return s; }
}

C# 编译器甚至会生成该Encode方法吗?如何查看生成的 IL 并比较使用和不使用该Encode方法的代码?

如果静态编译器不删除它,那么运行时 JIT 编译器呢?

4

1 回答 1

2

如果我有一个没有操作但返回传入参数的方法,编译器会将其从生成的 MSIL 中删除吗?

不,不可能——这会破坏任何试图通过反射等方式调用该方法的东西。

该方法可能会被 JIT 内联为空,但这是另一回事。有很多因素决定了方法是否可以内联,这些细节在不同版本的 CLR、不同的进程架构等之间有所不同。对于空方法,我希望它们被内联(当不在调试器中运行时)非- 虚拟通话。

如何查看生成的 IL 并比较使用和不使用 Encode 方法的代码?

  1. 编译代码。
  2. 反汇编,例如使用 `ildasm Foo.dll /out=before.il
  3. 更改代码
  4. 编译
  5. 拆卸,例如ildasm Foo.dll /out=after.il
  6. 比较before.ilafter.il
于 2012-11-30T15:39:45.580 回答