Roslyn CodeFix和Refactoring有什么区别?

7
我一直在搜寻与Roslyn API相关的所有可能文档,但是我找不到这个简单问题的答案。
我知道 CodeFix 继承自 CodeFixProvider 并提供了一个代码修复。 我也知道 Refactoring 继承自 CodeRefactoringProvider 并提供了一个重构。 我发现其中一个区别是,由于某种原因,您不能使用 Nuget 重新分发重构,只能通过 VSIX 进行分发,而您可以使用两者重新分发 CodeFix。
但是,Code Fix 和 Refactoring 到底是什么?它们各有什么优缺点?
3个回答

4

代码修复是指您在代码中发现了错误或失误,并能推断出如何纠正代码的情况。

重构是对代码的更改,通常不会使其更正也不会使其更差。通常会提供多个重构选项,可以将代码转换为各种形式,包括以前接受任何重构之前的形式。相比之下,在同一软件包中找到另一个可以应用于代码转换的代码修复非常罕见。


谢谢。我现在明白了概念上的区别。但是实际上有什么区别呢?代码重构能做到什么,而代码修复不能做到,反之亦然?为什么只能通过Nuget重新分发代码修复,而不能进行代码重构的技术限制? - Phoenix
@Phoenix - 我认为在Nuget中支持重构是没有任何不可能修复的限制的。但实际上,他们希望大多数重构都是通用的,因此将它们“全局”安装而不是按项目安装是有意义的。而至少一些代码修复将作为增强功能提供,以帮助使用特定API的人。 - Damien_The_Unbeliever
1
@Phoenix - 截至2015年,他们表示目前还不可能实现,但他们希望能够做到。评论中有一些有趣的观点,讨论了MEF可能是当前限制之一。 - Damien_The_Unbeliever
更多关注这些项目的使用场景和方式。代码修复可以通过Nuget分发,因为它们旨在与您的自定义组件和类一起分发;为了提供更好的IDE支持,以满足VS无法自行推断的特定功能需求。 - Bradley Uffner
@Dami 是的,我也看了那个答案。所以你的意思是说,在实际功能上,Code Fix 和 Refactoring 没有区别,只有在概念上有所不同?也就是说,两者都可以完成相同的操作,只是方式略有不同? - Phoenix
@Damien_The_Unbeliever 你好,你知道CodeRefactoringProvider(s)是否可以像2020年的CodeFixes和CodeAnalyzers一样通过NuGet进行发布吗?还是只能通过VSIX实现? - Divisadero

1

所接受的答案中的概念差异也是一种实际差异。

CodeFixProviders和CodeRefactoringProviders都生成用户可以应用于其代码的CodeActions。关键区别在于,由CodeFixProvider提供的每个CodeAction都必须与(并且被认为是解决)Roslyn Analyzer产生的一个或多个诊断相关联,而由CodeRefactoringProvider提供的CodeAction与任何诊断都不相关联。


0
除了之前的答案,代码修复和代码重构之间还有另一个功能上的区别。您可以通过覆盖GetFixAllProvider来轻松地为解决方案范围内的代码修复添加支持:
public override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer;

但据我所知,目前还没有一种简单的方法来提供大规模重构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接