C#编译器优化 – 未使用的方法

C#编译器(在VS2008或VS2010中)在编译时是否删除未使用的方法?

我认为决定是否使用公共方法可能有问题,所以我猜它会编译所有的公共方法。

但是在类中从未使用的私有方法呢?

编辑:

是否存在关于编译器optmization的一组规则,这些规则在任何地方都有记录?

只需检查发布版本的reflection器。 编译器不会删除未使用的私有方法。

有一些方法可以使用没有编译器知识的方法,比如reflection。 所以编译器不会尝试猜测。 它只是将方法留在那里。

编译器删除的唯一私有方法是没有实现的部分方法 。

对于C#编译器优化,请查看此处 。

编译器不会从程序集中删除任何方法,公共或私有。 实际上,我可以通过reflection引起奇怪的问题,并阻止对这些方法的运行时调用。

有很多框架(比如XAML解析器),它使您能够在没有静态绑定的情况下调用私有方法(在XAML文件中考虑OnClick =“myFunction”)当引发OnClick事件时,此标记将调用可能的私有myFunction。 ..但是编译器在编译时没有关于这种行为的信息。

动态代码也遇到同样的问题,也就是IL生成。 并且您可以在完全信任下执行时从任何对象访问私有方法。

不,他们不会被删除。 它可能会给你警告,但不会自己做。

这种优化在JIT级别上有效实现,这很好,因为它适用于公共/私有/任何方法。 如果从不调用方法(忽略ngen等),它永远不会被JITed。 现在你可能会说这仍然浪费了元数据等空间,但正如其他人所指出的那样,私有并不是那么私密。