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

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

我读过删除未使用的引用对编译器没有任何影响,因为它会忽略代码本身中未引用的程序集。

但我觉得很难相信,因为那么,删除未使用的引用的真正目的是什么?它对生成的程序集的大小或其他方面没有任何明显的影响。或者这种“智能”行为是否仅限于 C# 编译器 (csc.exe),而不是 vbc.exe 所固有的? 如果此功能如此无用,为什么

ReSharper

将其作为一项功能提供?为什么它在 Visual Studio 项目配置对话框中提供? 我能想到的唯一有用的活动是在部署期间。安装程序仍会复制引用(已使用或未使用)。但对于驻留在 GAC 中的程序集(例如 BCL 程序集),这也不是问题。

.net visual-studio reference
5个回答
14
投票

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

如果您考虑一下,CLR 很难确定是否真正使用了依赖项(一旦您添加了对它的引用,它就会在清单中作为依赖项出现)...特别是因为执行了某些依赖项代码路径无法提前知道...


12
投票


8
投票

删除未使用的代码可以使代码更加整洁,但也可以降低发生冲突的风险。有时,不同程序集中存在具有相同名称的类。例如,

Image

System.Drawing
中都有一个
System.Web.UI.WebControls
类。如果您对两个命名空间都有 using 指令并开始使用 Image 类,则编译器无法判断要使用哪一个。
    


7
投票

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


1
投票

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

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