我读过删除未使用的引用对编译器没有任何影响,因为它会忽略代码本身中未引用的程序集。
但我觉得很难相信,因为那么,删除未使用的引用的真正目的是什么?它对生成的程序集的大小或其他方面没有任何明显的影响。或者这种“智能”行为是否仅限于 C# 编译器 (csc.exe),而不是 vbc.exe 所固有的? 如果此功能如此无用,为什么
ReSharper将其作为一项功能提供?为什么它在 Visual Studio 项目配置对话框中提供? 我能想到的唯一有用的活动是在部署期间。安装程序仍会复制引用(已使用或未使用)。但对于驻留在 GAC 中的程序集(例如 BCL 程序集),这也不是问题。
测试此问题的一种方法是创建一个测试 WinForms 项目,添加对未使用的程序集(例如 System.Web)的引用,然后运行并附加到可执行文件(例如 F5)。 查看加载的模块(调试 -> Windows -> 模块),您将看到引用的程序集已加载。
如果您考虑一下,CLR 很难确定是否真正使用了依赖项(一旦您添加了对它的引用,它就会在清单中作为依赖项出现)...特别是因为执行了某些依赖项代码路径无法提前知道...
删除未使用的代码可以使代码更加整洁,但也可以降低发生冲突的风险。有时,不同程序集中存在具有相同名称的类。例如,
Image
和
System.Drawing
中都有一个System.Web.UI.WebControls
类。如果您对两个命名空间都有 using 指令并开始使用 Image 类,则编译器无法判断要使用哪一个。C# 编译器足够智能,仅在已编译程序集的元数据中为实际使用的程序集发出 . assembly 引用。 因此,在运行 Ngen.exe 时,您不会为不使用的程序集生成本机映像。 JIT 编译器不会受到任何影响,它只会根据需要加载程序集来翻译 IL。