“删除未使用的引用”的目的是什么

时间:2009-03-07 10:59:00

标签: .net visual-studio compiler-construction reference

我已经读过将未使用的引用makes no difference删除到编译器,因为它忽略了代码本身未引用的程序集。

但我觉得很难相信,因为那时Removing unused references的真正目的是什么?它对生成的组件的大小或其他方面没有任何明显的影响。或者智能行为仅限于C#编译器(csc.exe)而不是vbc.exe固有的?

如果此功能无用,为什么ReSharper会将其作为功能提供?为什么在Visual Studio项目配置对话框中提供它?

我能想到的唯一有用的活动是在部署期间。安装程序仍会复制引用(已使用或未使用)。但对于驻留在GAC中的程序集(例如,BCL程序集),这也不是问题。

5 个答案:

答案 0 :(得分:14)

它阻止CLR在运行时加载引用的模块。这将减少启动时间(因为加载每个模块需要时间)。根据模块的大小,它可能会显着缩短启动时间。

测试此方法的一种方法是创建测试WinForms项目,添加对未使用的程序集的引用(例如,System.Web),然后运行并附加到可执行文件(例如,F5)。查看加载的模块(Debug - > Windows - > Modules),您将看到引用的程序集已加载。

如果你考虑一下,CLR很难确定是否真的使用了一个依赖项(它在清单中作为依赖项,一旦你添加对它的引用)...特别是自执行以来一些代码路径无法事先知道...

答案 1 :(得分:12)

除了源文件较小外,我认为拥有一个没有未使用的代码或引用的干净源文件会更好。

答案 2 :(得分:8)

Visual Studio 2008还具有删除未使用的using指令的功能。

删除未使用的代码会使代码更整洁,但您也可以降低冲突风险。有时在不同的程序集中有相同名称的类。例如,ImageSystem.Drawing都有一个System.Web.UI.WebControls类。如果您对两个命名空间都使用了指令并开始使用Image类,则编译器无法确定要使用哪个。

答案 3 :(得分:7)

这是一项优化,可以让您的项目编译更快。它避免了编译器加载永远不会使用的元数据。这是次要的,我估计大约50毫秒,具体取决于硬盘的速度和文件系统缓存状态。

C#编译器非常智能,只能在已编译程序集的元数据中为实际使用的程序集发出.assembly引用。因此,您不会为运行Ngen.exe时不使用的程序集生成本机映像。 JIT编译器不会受到任何影响,只会根据需要加载程序集来转换IL。

答案 4 :(得分:1)

Visual Studio 2010的Reference Assistant是删除应用程序中未使用的引用的最佳工具。

http://visualstudiogallery.msdn.microsoft.com/fc504cc6-5808-4da8-ae86-8d3f9ed81606