我已经读过删除未使用的引用对编译器没有任何影响,因为它忽略了代码本身没有引用的程序集.
但我觉得很难相信,因为那么,删除未使用的引用的真正目的是什么?它对生成的组件的大小或其他方面没有任何明显的影响.或者这种智能行为仅限于C#编译器(csc.exe)而不是vbc.exe固有的?
如果此功能如此无用,为什么ReSharper将其作为功能提供?为什么在Visual Studio项目配置对话框中提供它?
我能想到的唯一有用的活动是在部署期间.安装程序仍会复制引用(已使用或未使用).但对于驻留在GAC中的程序集(例如,BCL程序集),这也不是问题.
它可以防止CLR在运行时加载引用的模块.这将减少启动时间(因为加载每个模块需要时间).根据模块的大小,它可能会显着减少启动时间.
测试这种方法的一种方法是创建一个测试WinForms项目,添加对未使用的程序集的引用(例如,System.Web)然后运行并附加到可执行文件(例如,F5).查看加载的模块(Debug - > Windows - > Modules),您将看到引用的程序集已加载.
如果你考虑一下,CLR很难确定是否真的使用了一个依赖项(它在清单中作为依赖项,一旦你添加对它的引用)...特别是因为执行了一些代码路径不能提前知道......
除了源文件较小外,我认为拥有一个没有未使用的代码或引用的干净源文件会更好.
Visual Studio 2008还具有删除未使用的using指令的功能.
删除未使用的代码会使代码更整洁,但您也可以降低冲突风险.有时在不同的程序集中有相同名称的类.例如,Image
在System.Drawing
和中都有一个类System.Web.UI.WebControls
.如果您对两个名称空间都使用了指令并开始使用Image类,则编译器无法确定要使用哪个名称空间.
这是一个优化,使您的项目编译更快.它避免了编译器加载永远不会使用的元数据.这是次要的,我估计大约50毫秒,具体取决于硬盘的速度和文件系统缓存状态.
C#编译器非常智能,只能在已编译程序集的元数据中为实际使用的程序集发出.assembly引用.因此,您不会为运行Ngen.exe时不使用的程序集生成本机映像.JIT编译器不会受到任何影响,只会根据需要加载程序集来转换IL.