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

问题描述 投票:0回答:4

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

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

但是类中从未使用过的私有方法又如何呢?

编辑:

是否有一组关于编译器优化的规则记录在任何地方?

c# visual-studio-2010 optimization visual-studio-2008
4个回答
26
投票

刚刚用发布版本签入了反射器。编译器不会删除未使用的私有方法。

有多种方法可以在不了解编译器知识的情况下使用方法,例如使用反射。所以编译器不会尝试猜测。它只是将方法留在那里。

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

有关 C# 编译器优化,请查看 here (archive.org)。


9
投票

编译器不会从程序集中删除任何方法,无论是公共的还是私有的。事实上,我可能会导致反射出现奇怪的问题,并阻止运行时调用此类方法。

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

动态代码也面临同样的问题,IL 生成也是如此。在完全信任的情况下执行时,您可以从任何对象访问私有方法。


3
投票

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


2
投票

不,它们不会被删除。它可能会向您发出警告,但不会自行执行。

© www.soinside.com 2019 - 2024. All rights reserved.