【问题标题】:Is the Find All References in Visual Studio good enough to judge if a piece of code is unused?Visual Studio 中的 Find All References 是否足以判断一段代码是否未使用?
【发布时间】:2018-09-03 20:36:19
【问题描述】:

我正在重构一个大型 C# 项目,很自然地会找到我的雪人未使用的死代码。

有一个名为 FooBar() 的函数,它看起来很有用,因为它里面有一堆代码。很明显,我试图使用“查找所有引用 (F9)”选项来查找对此函数的引用,但结果却是空手而归(即使是整个解决方案的范围)。

函数如下:

A 类有:

~
public virtual void FooBar(){

<function is empty>

}
~

我有一个 B 类:

public override void FooBar(){

~<doing something important here>~

}

我在这两个函数上都运行了“查找所有引用”,但没有出现任何结果。我假设它可以安全移除,但担心它是否确实在某处使用。 除此之外,我使用“在文件中查找”(具有解决方案范围)作为方法名称,它也显示为空。

我的问题是:“查找所有引用”是否获取所有用法?如果结果中没有显示任何内容,是否可以依靠它来查找和删除死代码?

编辑

此函数不是 API 的一部分,不会被任何外部代码调用。

【问题讨论】:

  • 这就是这个工具的重点。但是,如果您的解决方案之外的项目可能使用这些成员,请注意修改 public api。 “查找所有参考资料”肯定会在您的解决方案中进行搜索。这是删除公共成员的唯一安全方法是将其设为[Obsolete]
  • 仍然可以通过反射调用。那么就不一定能找到了。
  • 显然,解决方案无法告诉您是否有外部项目通过 DLL 使用您的代码。
  • "此函数不是 API 的一部分,不会被任何外部代码调用。"那么就只剩下关于反射的点了。
  • 我通常在源代码树中执行“在文件中查找”,它更加彻底。如果没有显示任何内容并且我知道没有其他解决方案引用此源,那么我拉下删除触发器。

标签: c# visual-studio


【解决方案1】:

不,有多种原因会找不到依赖它的代码。

  1. 它是一个公共 API,供其他项目使用。
  2. 代码通过反射调用。
  3. 代码位于未分析的文件中,例如 Razor 文件经常被跳过。

我相信除了这些之外还有更多的原因。

【讨论】:

  • 非常感谢!如果有人可以(也许)提供一个示例 sn-p 代码,我将不胜感激,该示例代码不会被“查找所有引用”注意到,但实际上被反射使用。
  • 例如:dotnetfiddle.net/rQC6yA(PS 不要这样,几乎肯定有更好的方法!)
  • 非常感谢,这准确地解释了我的困惑。 dotnetfiddle 也是 +1(我只知道 JSFiddle ;))。
  • 我猜,在整个源树中使用方法名称执行“在文件中查找”是否是查找其用法的最后手段?因为它只提供方法名称作为我在 Find 中寻找的字符串。
  • 是的,这是最有效的方法(尽管仍然不完全)。唯一没有错误的方法是进行适当的测试。
【解决方案2】:

它很有用,但不要完全依赖它。

即使“查找所有引用”没有显示任何用法,该方法仍有可能在某处使用。可能是通过反射或动态对象,或者如果代码位于库中,则使用此库的某些外部应用程序可以在 Visual Studio 不知道的情况下使用此方法。

我的建议是进行更彻底的研究,而不仅仅是“查找所有参考资料”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2017-05-23
    • 1970-01-01
    • 2014-09-21
    • 2018-01-19
    • 1970-01-01
    • 2021-03-31
    相关资源
    最近更新 更多