C# 快速作与重构

Visual Studio Code 提供了多种重构源代码的方法,以及快速修复工具,帮助你生成代码并在编程过程中解决问题。要访问它们,点击出现的“灯泡”图标,或使用命令 快速修复命令 ⌘。(Windows,Linux Ctrl+.)显示快速修复和重构选项列表。你也可以右键点击编辑器,选择重构 ⌃⇧R(Windows,Linux Ctrl+Shift+R),只显示重构选项。

支持的重构和快速修复

加入等待

内容:补充等待关键词指向函数调用。

何时:当你用异步方法调用函数时,

作指南:

  1. 在函数调用旁放置克拉(通常会用红色下划线)。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 精选添加等待.

加入等待示例

从成员中添加构造参数

内容:生成一个基于选定类成员参数的新构造器。

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

为什么:你可以在使用前声明构造器,但这个功能会自动生成构造器。

作指南:

  1. 在构造函数中高亮你想添加的类成员作为参数。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择生成构造器<classname>(<membertype>, <membertype>, < etc.>)。

从成员示例中添加构造函数参数

添加 DebuggerDisplay 属性

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

何时:你想在代码中程序化地钉住调试器中的属性

为什么:固定属性可以让你通过在调试器中将该属性气泡显示到对象属性列表顶部,快速检查对象。

作指南:

  1. 将光标放在类型、代理、属性或字段上。
  2. ⌘。(Windows,Linux Ctrl+)以触发快速作和重构菜单并选择添加调试器显示属性.
  3. 调试器显示属性被添加并加入一个自动方法返回默认值ToString().

添加 DebuggerDisplay 属性示例

添加明确的角色

内容:它允许你根据使用情况自动为表达式添加显式cast。

何时:你需要给表达式添加显式cast,并且想自动正确分配它。

为什么:你可以手动为表达式添加显式cast,但这个功能会根据代码上下文自动添加。

作指南:

  1. 把你的探头放在错误处。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择添加明确的演员阵容

添加文件头

内容:使用 EditorConfig 为现有文件、项目和解决方案添加文件头。

何时:你想轻松地为文件、项目和解决方案添加文件头。

为什么:你的团队要求你为了版权考虑包含文件头。

作指南:

  1. 如果你还没有 EditorConfig 的项目或解决方案,可以添加。
  2. 在你的 EditorConfig 文件中添加以下规则:file_header_template.
  3. 将规则的值设置为你希望应用的头文字。你可以使用{文件名}作为文件名的占位符。
  4. 把你的插入点放在任何C#文件的第一行。
  5. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  6. 选择添加文件头

添加缺失的使用/导入

内容:它让你能立即添加必要的导入,或者使用复制粘贴的指令。

何时:从项目中不同地方或其他来源复制代码并粘贴到新代码中是常见做法。这个快速作会查找缺少的导入指令,用于复制粘贴代码,然后提示你添加它们。该代码修复还可以在项目间添加引用。

为什么:因为快速作会自动添加必要的导入,你不需要手动复制代码所需的使用指令。

作指南:

  1. 从文件复制代码粘贴到新文件中,但不包含必要的使用指令。由此产生的错误伴随着一个代码修复,通过指令添加缺失的内容。
  2. 选择⌘。(Windows,Linux Ctrl+)打开快速作和重构菜单。
  3. 选择使用<你的参考资料>来添加缺失的引用。

添加缺失 / 导入示例

添加命名参数

内容:在函数调用中,将命名参数附加到指定的参数值后。

何时:如果你的方法参数很多,可以添加命名参数,让代码更易读。

作指南:

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

添加命名参数示例

将匿名类型转换为类

内容:将匿名类型转换为类。

何时:你有一个匿名型,想在职业中继续发展。

为什么:如果你只在本地使用匿名类型,它们很有用。随着代码增长,有一个简单的方式把它们升级到类上是件好事。

作指南:

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

将匿名类型转换为类示例

汽车财产和全财产之间的转换

内容:将自动实现的属性转换为完整属性。

何时:该物业的逻辑已经改变。

为什么:你可以手动将自动实现的属性转换为完整属性,但这个功能会自动帮你完成工作。

作指南:

  1. 把光标放在物业名称上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 请从以下两种选项中选择:

选择转换为完整房产。

转换为完整性质的示例

选择使用汽车属性。

以汽车财产为例

直接投射与“as”表达式之间的转换

内容:作为关键词。

何时:当你预期施法在某些场景下会失败时(作为)或者如果你从不预期施法失败(直接施法)。

作指南:

  1. 把光标放在变量上。
  2. ⌘。(Windows,Linux Ctrl+.)触发快速作和重构菜单。
  3. 请从以下两种选项中选择:

选择更改以施放

变更至铸件示例

精选变更为作为表情。

表达式示例的变更

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

内容:如果你的代码中有 for 循环,你可以用这种重构将其转换为 foreach 语句。

为什么:你可能想将 for 循环转换为 foreach 语句的原因包括:

  • 你在循环内部不使用本地循环变量,除了作为访问物品的索引。
  • 你想简化代码,减少初始化器、条件和迭代部分出现逻辑错误的可能性。

你可能想将foreach语句转换为for循环的原因包括:

  • 你希望在循环内部使用本地循环变量,而不仅仅是访问该项目。
  • 你是在迭代一个多维数组,需要对数组元素有更多控制。

作指南:

  1. 把你的护符放进福里奇对于关键词。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 请从以下两种选项中选择:

精选转换为对于.

转换为示例

精选转换为福里奇.

转换为

在 Get 方法和属性之间转换

将获取方法转换为财产

内容:它允许你将 Get 方法转换成属性(也可以选择你的 Set 方法)。

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

作指南:

  1. 把光标放在你的Get方法名里。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. (可选)如果你有Set方法,也可以在此时转换你的Set方法。选择替换<获取方法或设置方法名称>并设置属性

用属性示例替换Get方法。

将属性转换为 Get 方法。

内容:允许你将属性转换为 Get 方法

何时:你拥有的房产不仅仅是立刻设定和确定价值

作指南:

  1. 把光标放在你的Get方法名里。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择用方法替换<属性名称>

用方法示例替换属性名称

if和switch语句之间的转换

内容:转换 an如果将语句转换为 switch 语句,或是 C# 8.0 switch 表达式。

何时:你想转换一个如果对 A 的陈述切换陈述或切换表达,反之亦然。

为什么:如果你正在使用如果这种重构使得切换语句或切换表达式的过渡变得容易。

作指南:

  1. 将你的光标放在如果关键词。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 请从以下选项中选择:

精选转换为切换命题.

转换为语句示例

精选转换为切换表达.

转换为表达式示例

精选转换为如果命题.

转换为语句示例

在正字符串与逐字字符串之间转换

内容:它允许你在普通字符串和逐字字符串文字值之间转换。

何时:你要么想节省空间,要么让代码更清晰。

为什么:将逐字字符串字面量转换为普通字符串字面量可以帮助节省空间。将普通字符串文字转换为逐字字符串文字可以提供更清晰的理解。

作指南:

  1. 将你笔圈放在正弦或逐字串上:
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 请从以下选项中选择:

选择转换为普通字符串

选择“转换为逐字字串”。

将类别转换为记录

内容:把你的类转换成C#记录。

何时:当你想快速将类改为记录时,这类专门用于存储数据和不变性。

作指南:

  1. 把光标放在职业名称上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择转换为位置记录

在示例之前将类转换为记录

示例后将类转换为记录

将局部函数转换为方法

内容:将一个局部函数转换为方法。

何时:你有一个想在当前本地环境之外定义的本地函数。

为什么:你想把本地函数转换成方法,这样你就能在本地上下文之外调用它。当本地函数变长时,你可能想转换成一种方法。当你用独立的方法定义函数时,代码会更容易阅读。

作指南:

  1. 把光标放在本地函数里。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择转换为方法

将局部函数转换为方法示例

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

内容:将数字转换成十六进制、二进制或十进制数。

何时:当你想自动将数字转换成目标基数,而不必手动计算换算时,可以使用。

作指南:

  1. 把光标放在数字字面值上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 请选择以下选项之一:

选择转换为十进制。

转换为十进制示例

选择转换为十六进制

转换为十六进制示例

选择转换为二进制

转换为二进制示例

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

内容:转换aString.Format格式化的结果字符串(或占位符)值字符串。

何时:想快速插值字符串时用。

为什么:插值字符串可以给你一个更易读的版本String.Format并且可以直接访问你的变量名称。

作指南:

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

将占位符转换为插值字符串示例

将正字符串转换为插值字符串

内容:把普通字符串改成插值字符串。

何时:当你想清理代码、让代码更易读时使用。

作指南:

  1. 把光标放在你想转换的字符串上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择转换为插值字符串

在示例之前将转换为插值字符串

示例后转换为插值字符串

将元组转换为结构

内容:将你的元组转换为struct

何时:当想快速将元组更改为struct并且希望有固定数据可以多次访问。

作指南:

  1. 把光标放在元组上。

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

  3. 请选择以下选项之一:

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

将元组转换为选项

将元组转换为示例

封装场

内容:它允许你把字段转换成属性,并更新该字段的所有使用情况以使用新创建的属性。

何时:你想把一个字段移到属性里,并更新对该字段的所有引用。

为什么:你想让其他职业访问某个字段,但又不希望这些类别直接访问。通过将字段包裹在属性中,你可以编写代码来验证被赋值。

作指南:

  1. 把光标放在字段名称内,这样可以封装。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 请选择以下之一:

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

封装字段并使用属性示例

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

封装字段但仍然使用字段示例

生成比较算子

内容:允许你为实现的类型生成比较算子可喻.

何时:你有一个实现可喻我们会自动添加比较算子。

为什么:如果你在实现一个值类型,应该考虑覆盖平等者通过该方法获得比默认实现更高的性能平等者方法ValueType.

作指南:

  1. 把你的光标放在类内或IComparable关键词上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 从下拉菜单中选择“生成比较算符”。

生成默认构造函数

内容:它让你能立即生成一个新的类默认构造函数代码。

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

为什么:你可以在使用前声明构造器,但这个功能会自动生成构造器。

作指南:

  1. 把光标放在职业名称上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择生成构造器<classname>()

生成默认构造函数示例

生成参数

内容:自动生成方法参数。

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

为什么:你可以快速修改方法签名而不丢失上下文。

作指南:

  1. 把光标放在变量名里。
  2. ⌘。(Windows,Linux Ctrl+.)触发快速作和重构S 菜单。
  3. 选择生成参数

生成参数示例

明确实现所有成员

内容:在类中明确定义你的接口方法。显式接口实现是一个类成员,只能通过指定的接口调用。

何时使用:何时使用:

  • 你不希望为多个接口调用相同的实现。
  • 你需要解决两个接口各自声明同名不同成员的情况,比如属性和方法。

作指南:

  1. 把光标放在一个正在实现的类界面上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择“实现所有成员”明确表示

显式实现所有成员示例

隐式实现所有成员

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

作指南:

  1. 把光标放在一个正在实现的类界面上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择实现接口

隐式实现所有成员

内联方法

内容:内联方法重构。

何时:你希望用一个选项来替换单个语句体中静态、实例和扩展方法的使用。

为什么:这种重构提供了更清晰的语法。

作指南:

  1. 请关注该方法的使用。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 请从以下选项中选择:

选择内联<QualifiedMethodName>以移除内联方法声明:

内联方法示例

选择内联并保留<QualifiedMethodName>以保留原始方法声明:

内联与保持方法示例

内联临时变量

内容:允许你移除一个临时变量,并用它的值替换它。

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

原因:移除临时变量可能会让代码更易阅读。

作指南:

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

内联临时变量示例

引入局部变量 表示式

内容:让你可以立即生成一个本地变量来替换现有表达式。

何时:如果代码在本地变量中,之后可以轻松复用。

为什么:你可以多次复制粘贴代码以便在不同位置使用,但最好只执行一次作,将结果存储在本地变量中,然后全程使用本地变量。

作指南:

  1. 把你的圆滑点放在你想赋值到新局部变量的表达式上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 请从以下选项中选择:

选择引入局部 -> 引入局部以获得<表达式>

引入局部表达式示例

选择引入局部 -> 对所有 <表达式的出现选择引入局部>

引入参数

内容:允许你立即生成一个新参数来替换现有表达式。

何时:你有代码如果在参数中,可以方便地以后复用。

为什么:你可以多次复制粘贴代码,在不同位置使用,但最好只执行一次,将结果存储在参数中,并贯穿整个过程。

作指南:

  1. 把你的圆圈放在你想分配给新参数的表达式上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 请从以下选项中选择:

选择<表达式> ->引入参数,并直接更新呼叫站点

直接更新呼叫网站示例

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

将参数引入提取方法示例

选择引入参数以实现<表达式> ->进入新的超载

将参数引入新的超载示例

介绍使用命题

内容:添加一个使用语句 / 代码块发送给你的IDisposable实例。

何时:你有一个IDisposable例如,你希望确保这些物品被正确获取、使用和处理。

作指南:

  1. 把你的圆圈放在你想分配给新参数的表达式上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 精选介绍使用命题.

引入陈述示例

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

内容:允许你反转条件表达式或条件句以及 \ 接线员。

何时:你有一个条件表达式或条件句以及 \ 如果倒过来,会更容易理解。

为什么:反转表达式或条件句以及 \ 手动作可能会花费更长时间,并可能引发错误。这个代码修复可以帮助你自动完成重构。

作指南:

  1. 将光标置于条件表达式或条件句中以及 \ 接线员。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择反转条件或替换为&&||

反条件示例

用示例替换

如果

内容:允许你反转一个如果如果不是这样但不改变代码的含义。

何时:当你有如果如果不是这样这个陈述倒置后会更容易理解。

为什么:逆转一个如果如果不是这样手写陈述可能会花费更长时间,甚至可能出现错误。这个代码修复可以帮助你自动完成重构。

作指南:

  1. 把你的光标放在如果如果不是这样陈述。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 精选倒转如果.

反转示例

让成员保持静态

内容:让成员保持静态。

何时:你希望非静态成员是静态的。

为什么:静态成员提升可读性:知道特定代码是隔离的,更容易理解、重读和重用。

作指南:

  1. 把你的关注点放在会员名字上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择“制造静电”。

让成员保持静态示例

搬迁声明 参考点附近

内容:这样可以让你把变量声明的使用量更接近。

何时:你可以选择变量声明,这些声明可以放在更窄的范围内。

为什么:你可以保持原样,但这可能会导致可读性问题或信息隐藏。这是一个重构以提升可读性的机会。

作指南:

  1. 把光标放在变量声明中。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择“靠近参考”的移动声明

近参考示例的移动声明

将类型移动到匹配文件

内容:允许你将选中的类型移动到同名的独立文件中。

何时:你想分开的多个类、结构体、接口等都在同一个文件里。

为什么:在同一个文件中放置多种类型会使找到这些类型变得困难。通过将类型迁移到同名文件中,代码变得更易读且更易于导航。

作指南:

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

移动类型到匹配文件示例

命题的反面

内容:允许你反转对于陈述。

何时:当你想反转 a 的含义时,可以使用对于陈述及其迭代方式。

为什么:反演对于手写陈述可能会花费更长时间,甚至可能出现错误。这个代码修复可以帮助你自动完成重构。

作指南:

  1. 将你的光标放在对于陈述。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 精选背面对于命题.

反向陈述示例

拆分或合并if语句

内容:拆分或合并如果陈述。

何时:你想拆分如果使用或的陈述&&||将作符组成嵌套如果或合并一个命题如果带有外部的命题如果陈述。

为什么:这主要看风格偏好。

作指南:

如果你想拆分如果陈述:

  1. 将你的光标放在如果&&||接线员。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 精选拆分为嵌套如果陈述.

拆分成嵌套语句示例

如果你想合并内心如果与外层的陈述如果陈述:

  1. 把光标放在内侧如果关键词。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 精选与嵌套合并如果命题.

与嵌套语句合并示例

使用显式类型

内容:用这个重构来替换VAR在带有显式类型的本地变量声明中。

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

然而,当变量初始化为匿名类型并在后续访问对象属性时,必须使用 var 值。更多信息请参见隐式类型局部变量(C#)。

作指南:

  1. 把打衬放在VAR关键词。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 精选使用显式类型代替VAR.

使用显式类型代替示例

使用隐式类型

内容:利用这种重构来替换本地变量声明中的显式类型VAR.

为什么:这样可以符合你个人的编码规范,同时显示的代码更少。当变量被匿名类型初始化,且该对象的属性在后续访问时必须使用 Var。更多信息请参见隐式类型局部变量(C#)。

作指南:

  1. 将插入符放在明确类型关键词上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择使用隐式类型

使用隐式类型示例

使用λ表达式或块体

内容:允许你重构一个λ表达式,使其使用表达体或块体。

何时:你更倾向于让λ表达式使用表达体或块体。

为什么:Lambda表达式可以重构,根据用户偏好提升可读性。

作指南:

  1. 将光标放在Lambda作符的右侧。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 请选择以下之一:

选择“使用块体”以表示lambda表达式。

用块体作为λ表达式的例子

选择“使用表达体”以实现lambda表达式

使用表达式 body来处理 lambda 表达式

使用递归模式

内容:将代码块转换为递归模式。这种重构可通过交换语句、属性模式匹配、元组模式匹配和位置模式匹配来工作。

何时:使用递归模式可以让你的代码更易读、更干净。

作指南:

  1. 将光标放在你想转换为递归模式的表达式上。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 请选择以下之一:

精选转信切换表达到表达的陈述.

将语句转换为表达式示例

选择使用递归模式

在示例之前使用递归模式

例如,使用递归模式

包裹、缩进和对齐重构

包裹并对齐调用链

内容:它允许你包裹并对齐方法调用链。

何时:你有一个由多个方法调用组成的长链条。

为什么:阅读一长串时,如果列表有包裹或缩进,会根据用户偏好更容易阅读。

作指南:

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

包裹与对齐调用链示例

包绕、缩进和对齐参数或参数

内容:允许你包裹、缩进和对齐参数或参数。

何时:你有一个方法声明或调用,包含多个参数或参数。

为什么:阅读一长串参数或参数时,如果它们根据用户偏好进行包裹或缩进,会更容易。

作指南:

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

选择 Wrap 所有参数 -> 对齐 Wrapped 参数

对齐包绕参数示例

选择 包裹所有参数 -> 缩进所有参数

缩进所有参数示例

选择 Wrap 所有参数 -> Indent wrapped 参数

缩进包裹参数示例

包裹二进制表达式

内容:可以让你包裹二进制表达式。

何时:你有二元表达。

为什么:当二进制表达式被用户偏好包裹时,阅读起来更容易。

作指南:

  1. 将光标置于二进制表达式中。
  2. ⌘。(Windows,Linux Ctrl+)触发快速作和重构菜单。
  3. 选择 Wrap 表达式以接受重构。

包裹表达式示例