重构

ReSharper的重构集在数量,可用性和应用范围方面都超过了Visual Studio。每次重构都会分析应用它的代码选择的整个范围(包括整个解决方案),包括跨语言代码,并使用这种洞察力以最智能的方式更新代码。

ReSharper的所有重构都可以在C#中进行,绝大多数也可以在VB.NET中使用,有些可以在ASP.NET,JavaScript,TypeScript,XAML和其他受支持的语言中使用。

您可能还想查看ReSharper的上下文操作 ,这些操作实现了不太复杂的,主要是本地代码转换而不是Martin Fowler定义的真正重构方式。

在C#中重构此菜单

使用代码重构

要使用重构,可以放置插入符号:

  • 在文本编辑器中的符号上。
  • 在文本编辑器中选择代码。
  • 在“ 解决方案资源管理器”工具窗口中的一个文件或选定的文件上。
  • 在“ 文件结构”或另一个ReSharper工具窗口中的一个类型成员或一组类型成员上。

之后,您可以从ReSharper的Refactor菜单或使用其单独的键盘快捷键来调用所需的重构。另外,“ 重构”此命令Ctrl + Shift + R允许您查看可以在当前插入符号位置或当前选择中应用哪些重构。

在ReSharper中更改签名重构

更改签名

通过此重构,您可以通过以下方式修改方法签名:

  • 添加,删除,重命名或重新排序参数
  • 更改退货类型
  • 更改参数类型
  • 重命名方法

随着更改签名,ReSharper会搜索该方法的所有用法,并修改该方法的所有调用,实现和替代以反映更改。对于新添加的参数,在所有方法调用中都将替换用户提供的默认值。在重写中,传递给方法的原始参数将传递给基本调用。

在ReSharper中将扩展方法转换为静态重构

将扩展方法转换为纯静态

这种无对话的重构将扩展方法转换为同一类中的静态方法。反向功能由“ 将静态转换为扩展方法”提供

将静态转换为扩展方法

此重构将静态方法转换为扩展方法。为了成功进行转换,静态方法必须(1)至少具有一个参数,并且(2)必须位于静态类中。反向功能可通过“ 将扩展方法转换为纯静态”来使用

使用ReSharper的重构将接口转换为抽象类

将接口转换为抽象类

如果要向接口添加一些逻辑,或者感觉最好成为类,则应使用此重构。重构检查是否存在任何冲突,即检查实现接口的类型是否已经具有基本类型(C#中的错误,它没有多重继承)。

将抽象类转换为接口

您可以应用此重构将抽象类转换为接口。当您希望一个类从多个抽象类继承而来,因此需要将其中一个转换为接口时,此功能特别有用。

在ReSharper中提取超类重构

提取超类

通过这种重构,您可以为一个类创建基类,并将一些成员移至该类。只需将插入号放在类声明中,选择要提取的成员,然后运行重构即可。这对于将逻辑上移到继承层次结构以便以后共享非常有用。

在ReSharper中引入参数重构

介绍参数

在方法中选择一个表达式或局部变量,然后使用此重构从中创建一个新参数。所有呼叫站点将被更新以反映更改后的签名,同时保持逻辑和语义。

如果表达式使用在调用站点上不可访问的局部变量,则此重构允许将它们作为委托传递。

将方法设为静态/共享

通过使该重构转换的非静态方法为静态的(共享在VB.NET) this方法的一个参数。重构后,目标方法将被声明为静态方法(在VB.NET中为Shared),并将必要的参数添加到其调用站点。当您要移动非静态方法(在VB.NET中为非共享)时,重构也很有用。在这种情况下,请将“使方法静态化”用作“使方法非静态化”重构的准备步骤。

使方法为非静态/非共享

此重构将静态方法(在VB.NET中为Shared)转换为所选参数类型的实例方法(即,将方法移至参数类型并将参数转换为this ),并相应地转换方法调用。

移动实例方法

使用此重构,您可以将实例方法从当前类型快速移动到方法参数中出现的一种类型。

移动静态成员

重构将静态字段和方法移动到另一种类型。如果要移动非静态方法,请改用“ 移动实例方法”

将字符串移到资源

作为ReSharper 国际化功能包的一部分,此重构有助于将可本地化的字符串提取到资源文件中。在重构期间,显式字符串用法将替换为对资源包装器的引用。

您可以使用专用的快捷方式或“ 重构此”命令来调用此重构。但是,ReSharper还可以突出显示未放入资源文件中的字符串以进行代码检查,并建议将字符串移至资源重构作为快速修复。请参阅ReSharper帮助以了解如何配置ReSharper以执行此操作。

拉成员

此重构可帮助您将类型成员移动到超类或接口。此操作可用作概括行为的一种方式。ReSharper分析当前类中的所有成员,并列出您可以拉出的成员列表。在完成重构之前,ReSharper还会检查是否存在可能的冲突,例如,您尝试移动到超类的成员是否可以在目标类型中访问。反向功能可通过“ 下推成员”使用

下推成员

此重构可通过将类型成员移动到子类型来帮助您清理类型层次结构。此操作可用作专门化行为的方法。ReSharper会分析选定类型的所有成员,并列出您可以下推的成员。在完成重构之前,ReSharper还会检查可能的冲突,例如,您要下推的成员是否可以在目标类型中访问。反向功能可用于Pull Members Up

ReSharper中的拉取参数重构

拉参数

当您通过快速修复或“ 更改签名”重构向方法中添加新参数时,ReSharper不仅会更新签名和方法的所有用法,而且还会分析该方法所包含的调用链,并允许您在此链中的任何位置“拉”新参数。

在XAML中重命名重构

改名

通过重命名重构,您可以重命名任何符号,包括:名称空间,类型,方法,参数,局部变量,属性,字段和事件。它会自动查找并更正对该符号的所有引用。可以从编辑器直接调用重命名重构,有时也可以从其他视图(类视图,对象浏览器)调用。

重命名可用于所有受支持的语言和技术,包括C#,VB.NET,JavaScript,ASP.NET,JavaScript,XML,XAML和构建脚本。

使用重命名重构时,自动参考更正会完全扩展到XAML标记。此外,可以轻松重命名特定的XAML符号,例如名称空间别名和资源。

对于构建脚本,当您使用ReSharper重命名属性或目标时,其所有引用甚至注释和字符串中的用法都会自动更新以反映更改。

ReSharper中的转换参数重构

转换参数

此重构将创建一个新的类或结构,并将所选方法的参数转换为新创建的类型的封装字段。参数的用法转换为正在创建的类型的属性的用法。

它还可以让您摆脱out参数:对于void方法,如有必要,将一个或多个out参数转换为使用元组对象的返回值;对于非空方法,可以将它们与现有的返回类型组合在一起(再次使用元组对象)。

变换参数重构结合并替换了其他两个重构: 变换参数从Parameters中提取类

用工厂方法替换构造函数

这种重构用静态方法封装了构造函数,该方法返回一个类的新实例。

Factory Method模式是一种创建对象而无需指定将要创建的对象的确切类的方法。ReSharper生成用于创建对象的单独方法。子类可以重写它,以指定将要创建的对象的派生类型。

尽可能使用基本类型

通过这种重构,可以在可能的情况下,即不使用派生类型的成员的情况下,通过对特定类型的用法替换为其基本类型或接口的引用来泛化代码。在“ 拉动成员向上”重构之后,此功能特别有用。

复制类型

您只需花一秒钟的时间即可创建具有不同名称或在另一个命名空间中的类型的副本。ReSharper将负责为其创建单独的文件。对于部分类型,即使它们位于单独的文件中,也会复制所有部分。

将匿名转换为命名类型

此重构在当前方法(本地)或整个解决方案(全局)的范围内,将匿名类型转换为命名类型。在此重构提供的对话框中,您可以指定ReSharper是应生成自动属性还是具有后备字段的属性,还可以选择生成均等和格式化方法重载。

将索引器转换为方法

这种重构的工作原理与将属性转换为方法非常相似但是它适用于索引器(VB.NET中的默认属性)。您只能将getter,setter或两者都转换为方法。反向功能由Convert方法提供给Indexer

将方法转换为索引器

这与将Indexer转换为Method相反。它可以在无对话框模式下工作,但是您可能必须将其应用于两种方法,才能在索引器中同时生成getter和setter。

将方法转换为属性

这种重构允许用户将不带参数的非空方法转换为具有读取访问权限的属性,而将仅具有一个参数的空方法转换为具有写入访问权限的属性。配对的方法可以转换为单个读/写属性。

将属性转换为自动属性

此重构可帮助您将具有私有后备字段的属性转换为自动实现的属性(也称为自动属性)。重构将删除后备字段,并将其所有用法替换为新创建的自动属性。

在ReSharper中将属性转换为方法重构

将属性转换为方法

使用此重构,可以将具有读取访问权限的属性转换为getter类型的方法(无参数的非void方法),而具有写入访问权限的属性可以转换为setter类型的方法(仅具有一个参数的void方法)。至于允许读取和写入访问的属性,您可以将它们转换为成对的getter和setter类型的方法。

在ReSharper中提取类重构

提取类

您有一个班级要做的工作应该由两个不同的班级来完成吗?使用此重构将复杂的类分解为两个单一职责的类。提取类将帮助您选择从旧类移动到新类的方法和字段。它还会警告任何损坏的依赖关系和可访问性问题,并建议解决冲突的方法。

提取界面

通过此重构,您可以从类创建接口,并使该类实现所创建的接口。您可以选择要提取到接口的成员,并为接口指定名称。

提取方法

选择一个代码块,然后调用“提取方法”重构以将其转换为方法(VB.NET中的Sub或Function)。ReSharper将自动分析代码以检测返回值和/或out / ref参数。

介绍领域

选择一个表达式或局部变量,然后应用此重构。它将创建一个新的字段或常量,并使用表达式或局部变量初始值设定项对其进行初始化。可以在其初始值设定项,类型构造函数或当前成员中分配该字段。

内联字段

当字段具有单个写入用法时,此重构将用其初始化表达式替换该字段的读取用法,并一路删除字段声明和写入用法。

封装领域

封装字段重构使您可以从现有字段中快速创建访问器属性。该字段的用法会自动替换为该属性的用法。这种重构的明显优势是您可以禁止通过使用属性直接访问字段。

内联法

只要有可能,此重构就可以将方法的主体转移到其调用者的主体中,并完全删除该方法。反向功能由Extract Method提供。

通过ReSharper的重构引入变量

介绍变量

在成员代码中选择一个任意表达式,然后调用Introduce Variable重构。将声明一个新的隐式或显式类型的局部变量,并使用所选表达式对其进行初始化。原始表达式将替换为变量的名称。如果您的代码中多次出现原始表达式,则可以选择用新创建的变量替换它们。同样,您也可以为常量表达式引入常量。

内联参数

此重构可帮助您将方法的参数移入其主体。例如,如果在所有调用中将相同的常数值传递给该方法,则可以删除该参数,并可以在方法主体中添加相应的局部变量。

内联变量

选择一个任意变量或局部常量,然后调用“内联变量”重构。在代码中所有出现的所选变量将被其初始化程序替换。反向功能由Introduce Variable提供。

介绍用于子字符串重构的变量

为子字符串引入变量

此重构可帮助您快速将字符串的一部分移至单独的变量。根据目标C#版本,重构将使用字符串插值或将字符串包装为String.Format()

将类型移动到ReSharper中重构的匹配文件中

将类型移入匹配文件

此重构可以应用于单个文件或每个文件都具有多种类型的选择。ReSharper为每种类型创建专用文件并将其移到那里。

如果您想先使用类型,然后使用ReSharper的“ 从使用中创建”功能进行声明,则“将类型移入匹配文件”是必不可少的帮助器。

当您在与该文件所在的文件名不匹配的类的名称上按Alt + Enter时,此重构也有一个快捷方式。

移到文件夹

此重构有助于将类,文件或类或文件的选择移至解决方案中的另一个项目或文件夹。执行移动时,如有必要,ReSharper将使用指令进行更新。(可选)它可以根据新位置重命名名称空间,并将要移动的类分发到单独的文件中。

将类型移到外部范围

此重构将内部类型移到更高级别。如果内部类型使用封闭类型的成员,则将对封闭类型的引用作为参数传递给移动类型的构造函数。可以通过“移动重构”命令访问此重构。

将类型移动到另一个文件或命名空间

您可以轻松地在名称空间之间移动类型,并使用ReSharper自动更新的引用。您还可以将类型移动到外部或嵌套作用域或另一个文件。
使用此重构,您可以将实现给定类型的代码快速移动到单独的文件中。可以通过“移动重构”命令访问此重构。

当您使用XAML并将.NET类移动到另一个名称空间时,将对该类的XAML标记引用进行更新,并相应地插入/更改XAML导入指令。也可以从任何类型引用的XAML标记中直接调用此重构。

安全删除

如果要删除C#或VB.NET代码文件,ASP.NET代码和标记,构建脚本或XAML中的类型,类型成员或任何其他符号,请使用此重构来确保删除操作安全。如果未找到符号用法,或者有一些安全可折叠的符号,则将删除该符号。否则,ReSharper将为您显示所有不安全删除的用法,从而允许您编辑相应的代码。

可以将这种重构应用于选择的文件或文件成员,从而使您能够安全地删除整个子系统。

当您对目标或构建文件中的属性调用安全删除时,ReSharper会执行所有必要的验证和操作以删除所选符号。ReSharper还可以为您删除任何有冲突的参考。

提取成员以进行部分重构

将成员提取为部分成员

此重构可帮助您在部分类的不同类型部分之间快速移动类型成员。根据您的输入,重构将使用现有的零件或创建新的零件。

您甚至可以在#region上调用重构,以将所有区域成员移动到具有从区域名称推断出的名称的新文件中。

注意捷径

ReSharper的默认“ Visual Studio”键盘图中提供了此页面中提供的所有键盘快捷键。有关ReSharper的两个键盘映射的详细信息,请参见ReSharper文档