Roslyn CodeFix 和重构之间有什么区别?

What is the difference between a Roslyn CodeFix and Refactoring?

我一直在搜索我能找到的关于 Roslyn API 的所有可能文档,但找不到这个简单问题的答案。

我知道 CodeFix 继承自 CodeFixProvider 并提供代码修复。 我也知道一个Refactoring继承自CodeRefactoringProvider,提供一个Refactoring。 我发现的一个区别是,出于某种原因,您不能使用 Nuget 重新分发重构,只能通过 VSIX,而您可以使用两者重新分发 CodeFix。

但究竟什么是代码修复,什么是重构?有什么是一个人能做到另一个人做不到的?

代码修复是针对您在代码中发现错误错误的地方,并且可以推断出如何更正代码。

重构是对代码的更改,通常会使它既不多也不会少正确。提供多种重构以在各种形式之间转换代码的情况并不少见,包括通常返回到有人接受任何重构之前的形式。相比之下,极少找到另一个代码修复(在同一个包中)将代码转换为另一个代码修复可以应用的形式。

除了前面的答案之外,代码修复和代码重构之间还有另一个功能差异。您可以通过覆盖 GetFixAllProvider:

轻松添加对解决方案范围内代码修复的支持
public override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer;

但据我所知,没有这么简单的方法来提供大规模重构

已接受答案的概念差异在某种程度上也是实际差异。

CodeFixProviders 和 CodeRefactoringProviders 都会生成用户可以应用于其代码的 CodeAction。关键区别在于,CodeFixProvider 提供的每个 CodeAction 都必须与 Roslyn Analyzer 生成的一个或多个 Diagnostics 相关联(并且假定要解决),而 CodeRefactoringProvider 提供的 CodeAction 不与任何 Diagnostic 相关联。