重构

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

可用于C#的所有ReSharper重构大多数也适用于VB.NET,一些适用于ASP.NET、JavaScript、TypeScript、XAML和其他支持的语言。

您可能还想要查看 ReSharper 的上下文操作,它们会按照 Martin Fowler 定义的方式实现不太复杂、大多数为局部代码转换且不真实的重构。

C#中的Refactor This菜单

使用代码重构

要使用重构,您可以将脱字符号放置在以下位置:

  • 文本编辑器中的符号上。
  • 文本编辑器中的代码选择上。
  • Solution Explorer工具窗口中的一个文件或多个文件上。
  • File Structure 或另一个 ReSharper 工具窗口中的一个类型成员或多个类型成员上。

之后,您可以从ReSharper的Refactor菜单或使用ReSharper单独的键盘快捷键调用所需重构。 或者,Refactor This命令(Ctrl+Shift+R)会让您查看哪些重构可以在当前脱字符号位置或当前选择处应用。

ReSharper中的Change Signature重构

Change Signature

此重构允许您以下列方式修改方法签名:

  • 添加、移除、重命名或重新排列参数
  • 更改返回类型
  • 更改参数类型
  • 重命名方法

在更改签名时,ReSharper会搜索方法的所有用法并修改方法的所有调用、实现和重写以反映变更。 对于新添加的参数,用户提供的这些参数的默认值在所有方法调用中都会被替换。 在重写中,传递到方法的原始参数会传递到基调用。

ReSharper中的Convert Extension Method to Static重构

Convert Extension Method to Plain Static

这种无对话框重构可以将扩展方法转换为同一类中的静态方法。 反向功能由Convert Static to Extension Method提供。

Convert Static to Extension Method

此重构可以将静态方法转换为扩展方法。 为了成功地执行转换,静态方法必须(1)至少包含一个参数,并且(2)位于静态类中。 反向功能由 Convert Extension Method to Plain Static 提供。

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

Convert Interface to Abstract Class

如果您想要将某些逻辑添加到接口或者您希望它最好是类,应使用此重构。 此重构可以检查任何冲突,例如,实现已包含基类型的接口的类型(在C#中会出现错误,这种语言不包含多个继承)。

Convert Abstract Class to Interface

您可以应用此重构,将抽象类转换为接口。 如果您想要从多个抽象类中继承某个类,则需要将其中一个类转换为接口。此重构在这种情况下特别有用。

ReSharper中的Extract Superclass重构

Extract Superclass

使用此重构,您可以为类创建基类并将一些成员移动到基类中。 只需将脱字符号放置在类声明处,选择要提取的成员,然后运行重构。 当您将逻辑在继承性层次结构中向上移动以便稍后共享时,此重构将非常有用。

ReSharper中的Introduce Parameter重构

Introduce Parameter

在方法中选择表达式或局部变量,然后使用此重构从它创建新参数。 在维护逻辑和语义时,所有调用站点将更新以反映变更的签名。

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

Make Method Static/Shared

此重构可以通过生成方法的 this 参数,将非静态方法转换成静态方法(在 VB.NET 中为“共享”)。 重构后,目标方法将声明为静态(在VB.NET中为“共享”),而必需参数将添加到它的调用站点中。 如果您想移动非静态方法(在VB.NET中为“非共享”),也可以使用此重构。 在这种情况下,请将Make Method Static用作Make Method Non-static重构的准备步骤。

Make Method Non-Static/Non-Shared

此重构可以将静态方法(在VB.NET中为“共享”)转换成选定参数类型的实例方法(即将方法移动到参数的类型中并将参数转换成this),并相应地转换方法调用。

Move Instance Method

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

Move Static Member

此重构可以将静态字段和方法移动到其他类型。 如果您想移动非静态方法,请使用Move Instance Method

Move String to Resource

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

您可以使用专用的快捷键或Refactor This命令调用此重构。 不过,ReSharper也可以高亮显示未作为代码检查放置于资源文件中的字符串,并以快速修复的形式建议Move String to Resource重构。 请参阅 ReSharper 帮助,了解如何配置 ReSharper 执行此操作。

Pull Members Up

此重构可以帮助您将类型成员移动到超类或接口。 作为一种泛化行为的方式,此操作十分有用。 ReSharper会分析当前类中的所有成员,并以列表形式显示您可以向上拉取的成员。 在完成重构之前,ReSharper也会检查有无可能的冲突,例如,您尝试移动到超类的成员是否可以在目标类型中访问。 反向功能由Push Members Down提供。

Push Members Down

此重构可以帮助您将类型成员移动到子类型,以清理您的类型层次结构。 作为一种专用化行为的方式,此操作十分有用。 ReSharper会分析选定类型的所有成员,并以列表形式显示您可以向下拉取的成员。 在完成重构之前,ReSharper也会检查有无可能的冲突,例如,您尝试向下拉取的成员是否可以在目标类型中访问。 反向功能由Pull Members Up提供。

ReSharper中的Pull Parameter重构

Pull Parameter

在您将新参数添加到方法时(无论使用快速修复还是 Change Signature 重构),ReSharper 不仅会更新签名和方法的所有用法,还会分析方法所属的调用链,并允许您将新参数拉取到此链中的任意位置。

XAML中的Rename重构

Rename

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

Rename适用于所有支持的语言和技术,包括C#、VB.NET、JavaScript、ASP.NET、JavaScript、XML、XAML和生成脚本。

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

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

ReSharper中的Transform Parameters重构

Transform Parameters

此重构可以创建新类或结构并将选定方法的参数转换为新创建类型的封装字段。 参数用法会转换为正在创建的类型的属性的用法。

它也可以让您移除out参数:对于void方法,一个或多个out参数会转换为使用元组对象的返回(如果需要);对于非void方法,它们可与现有的返回类型(同样使用元组对象)相结合。

Transform Parameters重构结合并替换了两个其他重构:Transform Out ParametersExtract Class from Parameters

Replace Constructor with Factory Method

此重构可以使用会返回类的新实例的静态方法封装构造函数。

工厂方法模式是一种创建对象的方法,无需指定要创建的对象的具体类。 ReSharper会为创建对象生成单独的方法。 子类可以重写这个方法以指定要创建的对象的派生类型。

Use Base Type where Possible

使用此重构,通过将特定类型用法替换为对其基类型或接口(如有可能,即不使用派生类型的成员时)的引用,可以将您的代码泛化。 如果使用Pull Members Up重构,此重构会特别有用。

Copy Type

借助此重构,只需几秒钟,您就可以使用不同名称或在另一个命名空间内创建类型的副本。 ReSharper将为它创建单独的文件。 对于部分类型,即使它们位于单独的文件中,也会复制所有部分。

Convert Anonymous to Named Type

此重构会将当前方法(局部)或整个解决方案(全局)范围中的匿名类型转换为命名类型。 在此重构提供的对话框中,您可以指定ReSharper应生成自动属性还是包含支持字段的属性,也可以选择生成相等和格式化方法重载。

Convert Indexer to Method

此重构与 Convert Property to Method 很像,但它应用于索引器(在 VB.NET 中为默认属性)。 您可以只将getter或setter转换为方法,也可以同时转换两者。 反向功能由Convert Method to Indexer提供。

Convert Method to Indexer

这是Convert Indexer to Method的反向功能。 它以无对话框模式运行,但您需要将它应用到两个方法,以便在您的索引器中生成getter和setter。

Convert Method to Property

此重构允许用户将不包含参数的非void方法转换为具有读取权限的属性,将包含一个参数的void方法转换为具有写入权限的属性。 配对方法可以转换为单一的读取/写入属性。

Convert Property to Auto-Property

此重构可以帮助您将包含私有支持字段的属性转换为自动实现的属性(也称为自动属性)。 此重构会移除支持字段并使用新创建的自动属性替换它的所有用法。

ReSharper中的Convert Property to Method重构

Convert Property to Method

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

ReSharper中的Extract Class重构

Extract Class

您有一个类正在完成实际上应当由两个不同的类完成的任务吗? 使用此重构可以将复杂的类分解成两个单一职责的类。 Extract Class会帮助您选择要从旧类移动到新类的方法和字段。 对于任何中断的依赖项和可访问性问题,它还会发出警告,并建议冲突解决方案选项。

Extract Interface

此重构允许您从类创建接口并让该类实现已创建的接口。 您可以选择要提取到接口的成员并为接口指定名称。

Extract Method

选择代码块并调用Extract Method重构,以便将它转换为方法(在VB.NET中为Sub或Function)。 ReSharper会自动分析代码以检测返回值和/或out/ref参数。

Introduce Field

选择表达式或局部变量并应用此重构。 它将创建新的字段或常量,并使用表达式或局部变量初始值设定项将它初始化。 可以在字段的初始值设定项、类型构造函数或当前成员中为字段赋值。

Inline Field

当字段具有单个写入用法时,此重构会使用字段的初始化表达式替换它的读取用法,同时删除字段声明和写入用法。

Encapsulate Field

Encapsulate Field重构允许您从现有字段快速地创建访问器属性。 字段的用法会自动替换为属性的用法。 此重构明显的好处是,您可以不允许使用属性直接访问字段。

Inline Method

如有可能,此重构就可以将方法的主体转换为其调用方的主体并一同移除方法。 反向功能由Extract Method提供。

利用ReSharper的重构引入变量

Introduce Variable

选择成员代码中的任意表达式并调用Introduce Variable重构。 新的隐式或显式类型的局部变量将使用选定的表达式声明和初始化。 原始表达式会被替换为变量的名称。 如果您的代码中有原始表达式的多个实例,则可以选择使用新创建的变量替换所有表达式。 以同样的方式,您也可以为常量表达式引入常量。

Inline Parameter

此重构可以帮助您将方法的参数移动到它的主体中。 例如,如果同一常量值传递到它的所有调用中的方法,那么,可以将参数移除并在方法主体中添加相应的局部变量。

Inline Variable

选择任意变量或局部常量并调用“Inline Variable”重构。 代码中选定变量的所有实例都会替换为它的初始值设定项。 反向功能由Introduce Variable提供。

Introduce Variable for Substring重构

Introduce Variable for Substring

此重构可以帮助您快速地将字符串的一部分移动到单独的变量中。 根据目标C#版本的不同,重构将使用字符串内插或将字符串包围到String.Format()中。

ReSharper中的Move Types into Matching Files重构

Move Types into Matching Files

此重构可应用到单个文件或每个文件包含多个类型的许多文件。 ReSharper会为每个类型创建专用文件并将它们移动到相应位置。

如果您想先使用类型,然后利用 ReSharper 的 Create from Usage 功能声明它们,那么“Move Types into Matching Files”将不可或缺。

此重构还有一个快捷键,在与它所属文件的名称不匹配的类名称上按Alt+Enter可以调用此快捷键。

Move to Folder

此重构可以帮助您将一个类、一个文件、许多类或文件移动到解决方案中的另一个项目或文件夹中。 执行移动时,ReSharper会根据需要更新using指令。 或者,它可以根据新位置重命名命名空间并分发正移动到单独文件中的类。

Move Type to Outer Scope

此重构可以将内部类型移动到上一级。 在内部类型使用封闭类型的成员时,封闭类型的引用会作为一个参数传递到移动类型的构造函数。 可以通过Move重构命令访问此重构。

Move Type to Another File or Namespace

您可以在命名空间中轻松地移动类型,ReSharper会自动更新引用。 您也可以将类型移动到外部或将嵌套范围移动到另一个文件。
使用此重构,您可以将实现特定类型的代码快速移动到单独的文件中。 可以通过Move重构命令访问此重构。

在您使用XAML并将.NET类移动到另一个命名空间时,会更新类的XAML标记引用,以及相应地插入/更改XAML导入指令。 还可以在任何类型引用上直接从XAML标记调用此重构。

Safe Delete

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

此重构可应用于多个文件或文件成员,让您能够安全地删除整个子系统。

当您在生成文件中的对象或属性上调用Safe Delete时,ReSharper会执行所有必要的验证和操作以移除选定符号。 ReSharper还可以为您移除任何冲突的引用。

Extract Members to Partial重构

Extract Members to Partial

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

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

快捷键注释

本页面提供的所有键盘快捷键都在 ReSharper 的默认“Visual Studio”键盘映射中。 有关 ReSharper 两种键盘映射的详细信息,请参阅 ReSharper 文档