C# 快速操作和重构

Visual Studio Code 提供了多种重构源代码的方法,以及在编码时生成代码和修复问题的快速修复。要访问它们,请单击出现的“灯泡”图标,或使用**快速修复**命令 ⌘. (Windows, Linux Ctrl+.) 来显示快速修复和重构选项的列表。您也可以右键单击编辑器并选择**重构** ⌃⇧R (Windows, Linux Ctrl+Shift+R) 以仅显示重构选项。

支持的重构和快速修复

添加 await

**功能:** 将 await 关键字添加到函数调用。

**何时:** 当您在异步方法中调用函数时。

操作步骤

  1. 将光标置于函数调用处(很可能以红色下划线显示)。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**添加 await**。

Add await example

从成员添加构造函数参数

**功能:** 基于选定的类成员生成带有参数的新构造函数。

**何时:** 您引入了一个新的构造函数,并希望自动正确地声明它,并包含所有正确的参数。

**原因:** 您可以在使用构造函数之前声明它,但是此功能会自动生成它。

操作步骤

  1. 突出显示要作为参数添加到构造函数中的类成员。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**生成构造函数 <类名>(<成员类型>, <成员类型>, <等等>)**。

Add constructor parameters from members example

添加 DebuggerDisplay 属性

**功能:** DebuggerDisplay 属性控制对象、属性或字段在调试器变量窗口中的显示方式。

**何时:** 您希望在代码中以编程方式固定属性在调试器中。

**原因:** 固定属性允许您通过将其属性提升到调试器中对象属性列表的顶部来快速检查对象的属性。

操作步骤

  1. 将光标置于类型、委托、属性或字段上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单,然后选择**添加 DebuggerDisplay 属性**。
  3. `DebuggerDisplay` 属性已添加,同时添加了一个自动方法,该方法返回默认的 ToString()

Add DebuggerDisplay attribute example

添加显式转换

**功能:** 允许您根据用法自动向表达式添加显式转换。

**何时:** 您需要向表达式添加显式转换,并希望自动正确地分配它。

**原因:** 您可以手动向表达式添加显式转换,但是此功能会根据代码上下文自动添加。

操作步骤

  1. 将光标置于错误处。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**添加显式转换**。

添加文件头

**功能:** 使用 EditorConfig 向现有文件、项目和解决方案添加文件头。

**何时:** 您希望轻松地向文件、项目和解决方案添加文件头。

**原因:** 您的团队要求您包含文件头以用于版权目的。

操作步骤

  1. 如果您还没有 EditorConfig,请将其添加到项目或解决方案中。
  2. 将以下规则添加到您的 EditorConfig 文件:file_header_template
  3. 将规则的值设置为等于您要应用的文件头文本。您可以使用 {fileName} 作为文件名的占位符。
  4. 将光标置于任何 C# 文件的第一行。
  5. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  6. 选择**添加文件头**。

添加缺少的 using / 导入

**功能:** 允许您立即为复制粘贴的代码添加必要的导入或 using 指令。

**何时:** 从项目中的不同位置或其他来源复制代码并将其粘贴到新代码中是很常见的做法。此快速操作查找复制粘贴的代码中缺少的导入指令,然后提示您添加它们。此代码修复程序还可以添加从项目到项目的引用。

**原因:** 由于快速操作会自动添加必要的导入,因此您无需手动复制代码所需的 using 指令。

操作步骤

  1. 从文件中复制代码并将其粘贴到新文件中,而不包含必要的 using 指令。由此产生的错误会附带一个代码修复程序,该程序会添加缺少的 using 指令。
  2. 选择 ⌘. (Windows, Linux Ctrl+.) 以打开**快速操作和重构**菜单。
  3. 选择**使用 <您的引用>** 以添加缺少的引用。

Add missing  / imports example

添加命名参数

**功能:** 在函数调用中,将命名参数附加到指定的参数值。

**何时:** 如果您有一个包含许多参数的方法,则可以添加命名参数以使您的代码更具可读性。

操作步骤

  1. 将光标置于函数调用中的参数内。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**添加参数名称 <参数名称>**。

Add named argument example

将匿名类型转换为类

**功能:** 将匿名类型转换为类。

**何时:** 您有一个匿名类型,您希望在类中继续构建它。

**原因:** 如果您仅在本地使用匿名类型,则它们非常有用。随着代码的增长,最好有一种简单的方法将其提升为类。

操作步骤

  1. 将光标置于匿名 (var) 类型中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**转换为类**。

Convert anonymous type to class example

在自动属性和完整属性之间转换

**功能:** 在自动实现的属性和完整属性之间转换。

**何时:** 属性的逻辑已更改。

**原因:** 您可以手动在自动实现的属性和完整属性之间转换,但是此功能将自动为您完成工作。

操作步骤

  1. 将光标置于属性名称上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 从以下两个选项中选择

选择**转换为完整属性。**

Convert to full property example

选择**使用自动属性。**

Use auto property example

在直接转换和 'as' 表达式之间转换

**功能:** 使用 as 关键字在常规转换和尝试转换之间转换变量。

**何时:** 当您期望转换在某些情况下失败 (as) 或者如果您从不期望转换失败(直接转换)时。

操作步骤

  1. 将光标置于变量上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 从以下两个选项中选择

选择**更改为转换**。

Change to cast example

选择**更改为 as 表达式。**

Change to  expression example

在 for 循环和 foreach 语句之间转换

**功能:** 如果您的代码中有一个 for 循环,则可以使用此重构将其转换为 foreach 语句。

**原因:** 您可能希望将 for 循环转换为 foreach 语句的原因包括

  • 您在循环内不使用局部循环变量,除非将其用作访问项的索引。
  • 您希望简化代码并减少初始化器、条件和迭代器部分中出现逻辑错误的可能性。

您可能希望将 foreach 语句转换为 for 循环的原因包括

  • 您希望在循环内使用局部循环变量,而不仅仅是访问项。
  • 您正在迭代多维数组,并且您希望对数组元素进行更多控制。

操作步骤

  1. 将光标置于 foreachfor 关键字中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 从以下两个选项中选择

选择**转换为 for**。

Convert to  example

选择**转换为 foreach**。

Convert to

在 Get 方法和属性之间转换

将 Get 方法转换为属性

**功能:** 允许您将 Get 方法转换为属性(以及可选的 Set 方法)。

**何时:** 您有一个不包含任何逻辑的 Get 方法。

操作步骤

  1. 将光标置于您的 Get 方法名称中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. (可选)如果您有一个 Set 方法,您也可以此时转换您的 Set 方法。选择**将 <Get 方法或 Set 方法名称> 替换为属性**。

Replace Get method with property example

将属性转换为 Get 方法

**功能:** 允许您将属性转换为 Get 方法

**何时:** 您有一个属性,它涉及的操作不仅仅是立即设置和获取值

操作步骤

  1. 将光标置于您的 Get 方法名称中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**将 <属性名称> 替换为方法**。

Replace property name with method example

在 if 语句和 switch 语句之间转换

**功能:** 将 if 语句转换为 switch 语句或 C# 8.0 switch 表达式

**何时:** 您希望将 if 语句转换为 switch 语句或 switch 表达式,反之亦然。

**原因:** 如果您正在使用 if 语句,则此重构可以轻松过渡到 switch 语句或 switch 表达式。

操作步骤

  1. 将光标置于 if 关键字中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 从以下选项中选择

选择**转换为 switch 语句**。

Convert to  statement example

选择**转换为 switch 表达式**。

Convert to  expression example

选择**转换为 if 语句**。

Convert to  statement example

在常规字符串和逐字字符串之间转换

**功能:** 允许您在常规字符串和逐字字符串字面量之间转换。

**何时:** 您要么想节省空间,要么想在代码中提供更多清晰度。

**原因:** 将逐字字符串字面量转换为常规字符串字面量可以帮助节省空间。将常规字符串字面量转换为逐字字符串字面量可以提供更多清晰度。

操作步骤

  1. 将光标置于常规字符串或逐字字符串字面量上
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 从以下选项之一中选择

选择**转换为常规字符串**。

选择**转换为逐字字符串**。

将类转换为记录

**功能:** 将您的类转换为 C# 记录。

**何时:** 当您想快速将您的类更改为记录时,记录是为存储数据和不可变性而定制的。

操作步骤

  1. 将光标置于类名上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**转换为位置记录**。

Convert class to record before example

Convert class to record after example

将本地函数转换为方法

**功能:** 将本地函数转换为方法。

**何时:** 您有一个本地函数,您希望在当前本地上下文之外定义它。

**原因:** 您希望将本地函数转换为方法,以便您可以在本地上下文之外调用它。当您的本地函数变得太长时,您可能希望转换为方法。当您在单独的方法中定义函数时,您的代码更易于阅读。

操作步骤

  1. 将光标置于本地函数中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**转换为方法**。

Convert local function to method example

将数字字面量转换为十六进制、十进制或二进制数

**功能:** 在十六进制、二进制或十进制数之间转换数字。

**何时:** 当您希望自动将数字转换为所需的进制,而无需手动计算转换时使用。

操作步骤

  1. 将光标置于数字字面量上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择以下选项之一

选择**转换为十进制**。

Convert to decimal example

选择**转换为十六进制**。

Convert to hex example

选择**转换为二进制**。

Convert to binary example

将占位符转换为内插字符串

**功能:** 将 String.Format 格式化的结果字符串(或占位符)转换为内插字符串。

**何时:** 当您想快速使用内插字符串时使用。

**原因:** 内插字符串可以为您提供更易读的 String.Format 版本,并允许您直接访问变量名。

操作步骤

  1. 将光标置于 String.Format 占位符上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**转换为内插字符串**。

Convert placeholder to interpolated string example

将常规字符串转换为内插字符串

**功能:** 将常规字符串更改为内插字符串。

**何时:** 当您想清理代码并使其更具可读性时使用。

操作步骤

  1. 将光标置于要转换的字符串上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**转换为内插字符串**。

Convert to interpolated string before example

Convert to interpolated string after example

将元组转换为结构体

**功能:** 将您的元组转换为 struct

**何时:** 当您想快速将元组更改为 struct 并且想要拥有要多次访问的固定数据时使用。

操作步骤

  1. 将光标置于元组上。

  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。

  3. 选择以下选项之一

    • 选择**转换为 struct -> 更新包含成员中的用法**
    • 选择**转换为 struct -> 更新包含类型中的用法**
    • 选择**转换为 struct -> 更新包含项目中的用法**
    • 选择**转换为 struct -> 更新依赖项目中的用法**

Convert tuple to  options

Convert tuple to  example

封装字段

**功能:** 允许您将字段转换为属性,并更新该字段的所有用法以使用新创建的属性。

**何时:** 您希望将字段移动到属性中,并更新对该字段的所有引用。

**原因:** 您希望允许其他类访问字段,但不希望这些类具有直接访问权限。通过将字段包装在属性中,您可以编写代码来验证分配的值,例如。

操作步骤

  1. 将光标置于要封装的字段名称内。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择以下选项之一

选择**封装字段:<字段名称>(并使用属性)**。

Encapsulate field and use property example

选择**封装字段:<字段名称>(但仍使用字段)**。

Encapsulate field but still use field example

生成比较运算符

**功能:** 允许您为实现 IComparable 的类型生成比较运算符。

**何时:** 您有一个实现 IComparable 的类型,我们将自动添加比较运算符。

**原因:** 如果您正在实现值类型,则应考虑重写 Equals 方法,以获得比 ValueTypeEquals 方法的默认实现更高的性能。

操作步骤

  1. 将光标置于类内部或 IComparable 关键字上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 从下拉菜单中选择**生成比较运算符**。

生成默认构造函数

**功能:** 允许您立即在类上生成新默认构造函数的代码。

**何时:** 您引入了一个新的默认构造函数,并希望自动正确地声明它。

**原因:** 您可以在使用构造函数之前声明它,但是此功能会自动生成它。

操作步骤

  1. 将光标置于类名上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**生成构造函数 <类名>()**。

Generate default constructor example

生成参数

**功能:** 自动生成方法参数。

**何时:** 您在方法中引用了一个当前上下文中不存在的变量并收到错误;您可以生成一个参数作为代码修复。

**原因:** 您可以快速修改方法签名而不会丢失上下文。

操作步骤

  1. 将光标置于变量名称中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**生成参数**。

Generate parameter example

显式实现所有成员

**功能:** 在类中显式定义接口的方法。显式接口实现是一个类成员,仅通过指定的接口调用。

**何时使用**

  • 您不希望为多个接口调用相同的实现。
  • 您想解决两个接口各自声明相同名称的不同成员(例如属性和方法)的情况。

操作步骤

  1. 将光标置于类中正在实现的接口上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**显式实现所有成员**

Implement all members explicitly example

隐式实现所有成员

**功能:** 在类中隐式定义接口的方法。隐式接口实现是指将接口的方法和属性直接作为公共方法添加到类中。

操作步骤

  1. 将光标置于类中正在实现的接口上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**实现接口**

Implement all members implicitly

内联方法

**功能:** 内联方法重构。

**何时:** 您希望在单个语句体中替换静态、实例和扩展方法的用法,并可以选择删除原始方法声明。

**原因:** 此重构提供了更清晰的语法。

操作步骤

  1. 将光标置于方法的使用处。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 从以下选项之一中选择

选择**内联 <限定方法名称>** 以删除内联方法声明

Inline method example

选择**内联并保留 <限定方法名称>** 以保留原始方法声明

Inline and keep method example

内联临时变量

**功能:** 允许您删除临时变量并用其值替换它。

**何时:** 临时变量的使用使代码更难理解。

**原因:** 删除临时变量可能会使代码更易于阅读。

操作步骤

  1. 将光标置于要内联的临时变量内。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**内联临时变量**。

Inline temporary variable example

为表达式引入局部变量

**功能:** 允许您立即生成局部变量以替换现有表达式。

**何时:** 如果您有代码,如果它在局部变量中,则可以很容易地在以后重用它。

**原因:** 您可以多次复制和粘贴代码以在不同位置使用它,但是最好执行一次操作,将结果存储在局部变量中,并在整个过程中使用局部变量。

操作步骤

  1. 将光标置于要分配给新局部变量的表达式上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 从以下选项中选择

选择**引入局部变量 -> 为 <表达式> 引入局部变量**

Introduce local for expression example

选择**引入局部变量 -> 为 <表达式> 的所有出现位置引入局部变量**

引入参数

**功能:** 允许您立即生成新参数以替换现有表达式。

**何时:** 如果您有代码,如果它在参数中,则可以很容易地在以后重用它。

**原因:** 您可以多次复制和粘贴代码以在不同位置使用它,但是最好执行一次操作,将结果存储在参数中,并在整个过程中使用该参数。

操作步骤

  1. 将光标置于要分配给新参数的表达式上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 从以下选项中选择

选择**为 <表达式> 引入参数 -> 并直接更新调用站点**

Update call sites directly example

选择**为 <表达式> 引入参数 -> 到提取的方法中**

Introduce parameter into extracted method example

选择**为 <表达式> 引入参数 -> 到新的重载中**

Introduce parameter into new overload example

引入 using 语句

**功能:** 向您的 IDisposable 实例添加 using 语句/代码块。

**何时:** 您有一个 IDisposable 实例,您希望确保它被正确地获取、使用和释放。

操作步骤

  1. 将光标置于要分配给新参数的表达式上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**引入 using 语句**。

Introduce  statement example

反转条件表达式和逻辑运算

**功能:** 允许您反转条件表达式或条件 and \ or 运算符。

**何时:** 您有一个条件表达式或条件 and \ or 运算符,如果反转,则可以更好地理解它。

**原因:** 手动反转表达式或条件 and \ or 运算符可能需要更长的时间,并且可能会引入错误。此代码修复程序可帮助您自动执行此重构。

操作步骤

  1. 将光标置于条件表达式或条件 and \ or 运算符中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**反转条件**或**将 && 替换为 ||**

Invert conditional example

Replace  with  example

反转 if

**功能:** 允许您反转 ifif else 语句,而不会更改代码的含义。

**何时:** 当您有一个 ifif else 语句,反转后会更容易理解时。

**原因:** 手动反转 ifif else 语句可能需要更长的时间,并且可能会引入错误。此代码修复程序可帮助您自动执行此重构。

操作步骤

  1. 将光标置于 ifif else 语句中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**反转 if**。

Invert  example

将成员设为静态

**功能:** 将成员设为静态。

**何时:** 您希望将非静态成员设为静态。

**原因:** 静态成员提高了可读性:知道特定代码是隔离的,使其更易于理解、重读和重用。

操作步骤

  1. 将光标置于成员名称上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**设为静态**。

Make member static example

将声明移至引用附近

**功能:** 允许您将变量声明移动到更接近其用法的位置。

**何时:** 您有可以在更窄范围内的变量声明。

**原因:** 您可以保持原样,但这可能会导致可读性问题或信息隐藏。这是一个重构以提高可读性的机会。

操作步骤

  1. 将光标置于变量声明中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**将声明移至引用附近**。

Move declaration near reference example

将类型移动到匹配的文件

**功能:** 允许您将选定的类型移动到同名的单独文件中。

**何时:** 您在同一个文件中有多个类、结构、接口等,您想将它们分开。

**原因:** 将多个类型放在同一个文件中可能会使查找这些类型变得困难。通过将类型移动到同名的文件中,代码变得更具可读性,并且更易于导航。

操作步骤

  1. 将光标置于定义类型的名称内。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**将类型移动到 <类型名称>.cs**。

Move type to matching file example

反转 for 语句

**功能:** 允许您反转 for 语句。

**何时:** 当您想反转 for 语句的含义及其迭代方式时使用。

**原因:** 手动反转 for 语句可能需要更长的时间,并且可能会引入错误。此代码修复程序可帮助您自动执行此重构。

操作步骤

  1. 将光标置于 for 语句中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**反转 for 语句**。

Reverse  statements example

拆分或合并 if 语句

**功能:** 拆分或合并 if 语句。

**何时:** 您想将使用 &&|| 运算符的 if 语句拆分为嵌套的 if 语句,或将 if 语句与外部 if 语句合并。

**原因:** 这是一个风格偏好问题。

操作步骤

如果您想拆分 if 语句

  1. 将光标置于 if 语句中 &&|| 运算符旁边。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**拆分为嵌套的 if 语句**。

Split into nested  statements example

如果您想将内部 if 语句与外部 if 语句合并

  1. 将光标置于内部 if 关键字中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**与嵌套的 if 语句合并**。

Merge with nested  statements example

使用显式类型

**功能:** 使用此重构将局部变量声明中的 var 替换为显式类型。

**原因:** 为了提高代码的可读性,或者当您不想在声明中初始化变量时。

但是,当使用匿名类型初始化变量并在稍后访问对象的属性时,必须使用 var。有关更多信息,请参阅隐式类型的局部变量 (C#)

操作步骤

  1. 将光标置于 var 关键字上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**使用显式类型代替 var**。

Use explicit type instead of  example

使用隐式类型

**功能:** 使用此重构将局部变量声明中的显式类型替换为 var

**原因:** 为了符合您的个人编码约定并减少显示的代码量。当使用匿名类型初始化变量并在稍后访问对象的属性时,必须使用 Var。有关更多信息,请参阅隐式类型的局部变量 (C#)

操作步骤

  1. 将光标置于显式类型关键字上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**使用隐式类型**。

Use implicit type example

使用 Lambda 表达式或块体

**功能:** 允许您重构 Lambda 表达式以使用表达式体或块体。

**何时:** 您希望 Lambda 表达式使用表达式体或块体。

**原因:** 可以重构 Lambda 表达式以根据您的用户偏好提高可读性。

操作步骤

  1. 将光标置于 Lambda 运算符的右侧。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择以下选项之一

选择**为 Lambda 表达式使用块体**。

Use block body for lambda expressions example

选择**为 Lambda 表达式使用表达式体**。

Use expression body for lambda expressions

使用递归模式

**功能:** 将代码块转换为使用递归模式。此重构适用于 switch 语句、属性模式匹配、元组模式匹配和位置模式匹配。

**何时:** 使用递归模式可以使您的代码更具可读性/更简洁。

操作步骤

  1. 将光标置于要转换为递归模式的表达式上。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择以下选项之一

选择**将 switch 语句转换为表达式**。

Convert  statement to expression example

选择**使用递归模式**。

Use recursive patterns before example

Use recursive patterns after example

包装、缩进和对齐重构

包装并对齐调用链

**功能:** 允许您包装和对齐方法调用链。

**何时:** 您有一个长链,由一个语句中的多个方法调用组成。

**原因:** 当长列表根据用户偏好进行包装或缩进时,阅读起来更容易。

操作步骤

  1. 将光标置于任何调用链中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择**包装调用链**或**包装并对齐调用链**以接受重构。

Wrap and align call chain example

包装、缩进和对齐参数或自变量

功能: 可以让你对参数或自变量进行换行、缩进和对齐。

何时: 当你有一个方法声明或调用,其中包含多个参数或自变量时。

原因: 当参数或自变量的长列表根据用户偏好进行换行或缩进时,阅读起来会更容易。

操作步骤

  1. 将光标放在参数列表中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 从以下选项中选择

选择 换行每个参数 -> 对齐换行的参数

Align wrapped parameters example

选择 换行每个参数 -> 缩进所有参数

Indent all parameters example

选择 换行每个参数 -> 缩进换行的参数

Indent wrapped parameters example

包装二元表达式

功能: 可以让你对二元表达式进行换行。

何时: 当你有一个二元表达式时。

原因: 当二元表达式根据用户偏好进行换行时,阅读起来会更容易。

操作步骤

  1. 将光标放在二元表达式中。
  2. ⌘. (Windows, Linux Ctrl+.) 触发**快速操作和重构**菜单。
  3. 选择 换行表达式 以接受重构。

Wrap expression example