【问题标题】:C# class used only in refer projects inspection?仅在参考项目检查中使用的 C# 类?
【发布时间】:2019-08-05 13:58:25
【问题描述】:

看看下面的解决方案:

MySolution.sln
   MyApp.csproj
   MyClassLib.csproj
      MyClass.cs

MyClassLib 项目被 MyApp 项目引用并包含 MyClassMyClass 只在MyApp 中使用,所以可以移到那里。

有没有办法用一些工具来确定这种情况?也许是 Roslyn 或 Resharper 检查? 对于具有悠久历史和许多项目的复杂解决方案,这是必需的功能。

【问题讨论】:

  • "MyClass 只在 MyApp 中使用,所以可以移到那里。"你不应该(只)重构它们使用的类,而应该重构它们逻辑上属于的地方。在一个程序集中有一些类而只有一个其他程序集使用该类型是完全有意义的。
  • @HimBromBeere,我相信这种重构会带来更好的解决方案逻辑结构。

标签: c# class reference project solution


【解决方案1】:

不,没有这样的工具。

为什么?简单:如果将来某个时候,您创建了一个MyApp2 并且还需要MyClass 怎么办?那么如果MyClass 不在MyApp 程序集中会更好。

现在,作为开发此功能的人类,您可能知道永远不会(尽管永远不会说永远)存在MyApp2,但工具不可能知道这一点。

【讨论】:

  • 好的,如果我创建一个仅用于包含类的公共属性,该工具会提供我将其设为私有。它永远不知道将来是否会从外部使用,但仍然愿意这样做。我在这里看到了与项目中的类的类比。
  • @AsValeO 这只是一个提示,您没有必须这样做。没有工具可以表明该建议是否真的逻辑上有意义,而只是句法上。所以不要仅仅因为工具建议你重构你的所有代码。
  • @HimBromBeere,那么我只需要一个提示就可以将一个类移动到另一个项目。这对我来说很有用。
【解决方案2】:

我对 ReSharper 的使用经验有限,但根据我的经验,ReSharper不能自动检测这些可以移动文件的情况,但可以可视化这些层次结构。

回到您之前的示例,层次结构工具将显示您的 MyClass.cs 文件仅由 MyApp.csproj 中的文件使用。 (它不会明确说明这一点,但您可以根据层次结构进行判断。)

【讨论】:

    【解决方案3】:

    您可以在 Visual Studio 中使用 CodeLens 来检查使用的位置

    或右键单击类(或 shift+f12)以“查找所有引用”并检查使用的位置。这为您提供了一个快速概览,让您了解您的项目结构,以及将课程移动到其他地方的需要。

    或使用

    Code analysis toolsother code tools 检查冗余等。

    除非你摆弄这些工具,否则你无法自动确定这些,因为这是一个边缘情况,当你知道一个类是否应该放在某个地方并且没有人工智能可以替代它时,除非你编写自己的自定义代码分析工具完成特定任务。

    编辑:由于作者似乎非常有动力和决心深入研究这个问题,我建议你去T4 code generationDSLCodeDOM 看看你是否真的可以生成或分析你的代码想要

    或者,创建Custom code analysis rulesets 或检查already present 是否适合您

    【讨论】:

    • 几乎在那里,CodeLens 提供了所有必需的信息。我正在寻找自动化的方法,或者我应该手动查看每个类。但他们是数十亿......)
    【解决方案4】:

    @MindSwipe 是对的。但是,如果您真的需要这样做,那么这里有一个技巧:

    1. 确保您的解决方案受版本控制。这对以后有帮助。
    2. 选择项目MyClassLib 并在当前项目的所有文件中运行查找和替换:public classinternal class
    3. 构建您的解决方案以获取大量错误
    4. 打开ErrorList 窗格并按描述对其进行排序

    您应该会看到错误消息,例如: The type or namespace name 'MyClass' could not be found (are you missing a using directive or an assembly reference?)

    如果您看到每个类恰好有 1 条消息,则表示该类可以从库项目移动到产生此错误的项目。否则意味着它被至少 2 个项目共享;在这种情况下,您必须再次将其公开(撤消全局替换对此类所做的更改)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      相关资源
      最近更新 更多