C#编译器(在VS2008或VS2010中)是否在编译时删除未使用的方法?
我认为决定是否使用公共方法可能会有问题,所以我猜它会编译所有的公共方法。
但是从未在类中使用的私有方法呢?
修改
是否有一套关于编译器optmization的规则在任何地方都有记录?
答案 0 :(得分:22)
只需使用发布版本检入反射器即可。编译器不删除未使用的私有方法。
有一些方法可以使用没有编译器知识的方法,比如反射。所以编译器不会尝试猜测。它只是将方法留在那里。
编译器删除的唯一私有方法是partial methods而没有实现。
对于C#编译器优化,请查看here。
答案 1 :(得分:8)
编译器不会从程序集中删除任何方法,公共或私有。事实上,我可以通过反射引起奇怪的问题,并阻止对这些方法的运行时调用。
有很多框架(比如XAML解析器)可以让你在没有静态绑定的情况下调用私有方法(想想XAML文件中的OnClick =“myFunction”)这个标记会在OnClick事件时调用潜在的私有myFunction引发了......但是编译器在编译时没有关于这种行为的信息。
动态代码也遇到同样的问题,IL生成也是如此。并且您可以在完全信任下执行时从任何对象访问私有方法。
答案 2 :(得分:2)
不会删除它们。它可能会给你警告但不会自己做。
答案 3 :(得分:2)
这种优化是在JIT级别有效实现的,这很好,因为它适用于公共/私有/任何方法。如果从不调用方法(忽略ngen等),它永远不会被JITed。现在你可能会说这仍然浪费了元数据等空间,但正如其他人所指出的那样,私有并不是那么私密。