参加你附近的 ,了解 VS Code 中的 AI 辅助开发。

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. 选择 **添加文件头**。

添加缺失的 usings / 导入

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

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

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

操作方法

  1. 从一个文件中复制代码并粘贴到另一个新文件中,但不包含必要的 using 指令。产生的错误会伴随一个代码修复选项,用于添加缺失的 using 指令。
  2. 选择 ⌘. (Windows, Linux Ctrl+.) 打开 **快速操作和重构** 菜单。
  3. 选择 **Using <你的引用>** 来添加缺失的引用。

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# 记录 (record)。

时机:当你想快速将类更改为记录时,记录类型专为存储数据和不可变性而设计。

操作方法

  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