【问题标题】:What is the purpose of "remove unused references"“删除未使用的引用”的目的是什么
【发布时间】:2010-10-11 22:09:36
【问题描述】:

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

但我很难相信,因为Removing unused references的真正目的是什么?它对生成的程序集的大小或其他方面没有任何明显的影响。或者这种 smart 行为是否仅限于 C# 编译器 (csc.exe) 而不是 vbc.exe 所固有的?

如果这个功能这么没用,为什么ReSharper 提供它作为一个功能?为什么在 Visual Studio 项目配置对话框中提供它?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    如果你仔细想想,CLR 很难确定一个依赖项(一旦你添加了对它的引用,它就在清单中作为依赖项)是否真的被使用了......尤其是因为执行一些代码路径无法提前知道...

    【讨论】:

    • CLR 如何在运行时加载一个其引用已被编译器优化删除的模块?我在这里错过了什么?
    • @Dan - 我也不明白为什么这个答案会得到这么多的支持,从我在其他帖子上读到的内容来看,如果不是,编译器不会将程序集引用放在最终输出中用过的。引用的程序集只会在第一次调用它们的方法时由 JIT 加载。此答案作为证明带来的加载模块窗口可能会显示所有引用,因为它处于调试模式。
    • @BornToCode 另外,如果it [is] hard for the CLR to determine whether or not a dependency is really used,那么“删除未使用的引用”是如何工作的呢?确定是否使用引用很简单:如果没有代码引用该程序集的命名空间中的任何内容,则它未被使用。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,Cristophe,但问题仍然存在……如何/为什么更好?
    • 这更好,因为您的源文件不会因为未使用的代码/导入而变得臃肿,因此更易于阅读和理解。此外,我认为编译器要做的工作会更少,编译会更快一点。 (我对此不是 100% 确定,这是特定于编译器的)
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      这是一种让您的项目编译速度更快的优化。它避免了编译器加载永远不会使用的元数据。虽然这是一个小问题,但我猜大约是 50 毫秒,具体取决于硬盘驱动器的速度和文件系统缓存状态。

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

      【讨论】:

      • 这是否意味着在加载 NGENed 程序集时,所有引用的程序集也会随后加载?或者换句话说:不能延迟加载本机程序集?至少当我比较我的应用程序的加载程序集(JITed 与 NGENed)时,我看到的是这样。
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-19
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        • 1970-01-01
        • 2011-03-01
        • 1970-01-01
        • 2011-02-09
        相关资源
        最近更新 更多