没有操作的方法会编译出来吗?

时间:2012-11-30 15:38:26

标签: c# compilation

如果我有一个没有操作的方法但返回传入的参数,编译器会将其从生成的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编译器呢?

1 个答案:

答案 0 :(得分:2)

  

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

没有。它不可能 - 这将破坏任何试图通过反射调用该方法等等。

JIT可能无法将该方法内联到任何内容,但这是另一回事。有各种各样的东西决定了方法是否可以内联,并且这些细节在CLR的不同版本,不同的进程架构等之间有所不同。对于空方法,我希望它们被内联(当不在调试器中运行时)用于< em>非虚拟电话。

  

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

  1. 编译代码。
  2. 拆卸,例如使用`ildasm Foo.dll /out=before.il
  3. 更改代码
  4. 编译
  5. 拆卸,例如ildasm Foo.dll /out=after.il
  6. 比较before.ilafter.il