代码清理
ReSharper 允许您以批量模式应用 格式化和其他代码样式偏好 ,从而立即消除一个或多个文件、项目或整个解决方案中的代码样式违规。
代码清理配置文件
代码清理可以根据您的需求在不同情况下应用各种配置(配置文件)。 开箱即用地提供了三个默认配置文件:
这些配置文件在大多数情况下都很有帮助,但您无法配置它们。 如果您希望使用自定义的 清理任务集运行代码清理,您需要创建一个自定义配置文件并在其中指定所需的任务集。
创建新的自定义清理配置文件
从主菜单中选择 或按下 Alt+R O 。
转到清理配置文件设置页面: 。
在左侧选择一个现有的配置文件,然后单击页面顶部的 重复。 ReSharper 将创建一个新的清理配置文件,其任务集与原始配置文件相同。
在配置文件列表中选择新创建的配置文件。
单击页面顶部的 配置。
所选配置文件的 任务在右侧变为可编辑。 根据需要配置它们。
如果您希望在保存修改之前创建或编辑其他配置文件,请单击页面顶部的 完成 以暂时记住当前配置文件的修改。
在 选项 对话框中点击 保存 以应用修改,让 ReSharper 选择保存位置,或者通过从 保存到 选择器中选择特定的设置层来保存修改。 有关更多信息,请参见 管理和共享 resharper 设置。
当您 运行代码清理时,新创建的清理配置文件将在 代码清理 对话框中可用。 您还可以将此配置文件设置为用于 静默清理。
同时使用不同的清理配置文件
ReSharper 允许您为 解决方案中的大多数文件 使用特定的代码清理配置文件,并为某些文件使用不同的代码清理配置文件。 您还可以完全跳过某些文件的清理。
为此,请使用 resharper_substitution_for_cleanup_profile EditorConfig 属性,并采用以下语法:
此语法允许您在使用特定配置文件启动 Code Cleanup 时使用不同的配置文件——在此情况下,在 => 左侧指定该配置文件的名称;或者在使用任意配置文件启动 Code Cleanup 时——在此情况下,在 * 左侧写入 =>。 在 => 右侧指定应使用的配置文件名称,或者如果不应对匹配的文件应用 Code Cleanup,则写入 skip。
运行代码清理
ReSharper 可以将代码清理应用于任意选定的代码块、当前文件中的所有代码、目录中的所有文件、当前项目,甚至是整个解决方案。 通过选择正确的 清理任务集并选择正确的 清理配置文件 ,确保选择正确的设置。
清理选定内容或文件
选择您希望清理代码的范围:
在编辑器中选择内容以清理选定内容中的代码。
将光标放置在文件中的任意位置以清理文件中的代码。
如果您正在清理选定内容,请按 Alt+Enter 并选择 。
或者,您可以按照以下步骤操作,适用于选区和文件。
执行以下操作之一:
按下 Control+Alt+F 或从主菜单中选择 。
右键单击文本编辑器中的任意位置或右键单击选定内容,并在上下文菜单中选择 清理代码。
在打开的 代码清理 对话框中,选择一个 清理配置文件以应用。 使用所选配置文件右侧的区域检查该配置文件中包含的任务。
如果没有可用的配置文件适合您,请选择一个现有的配置文件并单击 重复 以 创建新的自定义配置文件。
请注意,如果您在此对话框中创建或修改清理配置文件,您的更改将使用 智能保存逻辑保存。 如果您需要将修改保存到 共享设置层 ,请在 ReSharper 选项的 页面上进行修改,单击 保存到 ,然后选择所需的设置层。

单击 运行 以清理选定范围内的代码。
默认情况下,编辑器中打开的文件在清理后不会自动保存。 如果您希望在清理后启用自动保存,请在 ReSharper 选项 的 页面上选择 在清理应用于整个文件后保存 Alt+R, O 。
您不仅可以清理单个文件,还可以清理目录、项目或整个解决方案中的多个文件。 为此,请从 解决方案资源管理器 运行代码清理。
清理多个文件、项目或整个解决方案
在 解决方案资源管理器 中选择一个或多个项目(文件、目录、项目或解决方案)。
执行以下操作之一:
按下 Control+Alt+F 或从主菜单中选择 。
右键单击所选内容,并在上下文菜单中选择 清理代码。
选择上文描述的清理配置文件。
单击 运行 以清理选定范围内的代码。
您可以在每次保存文件更改时运行代码清理,以确保您的编辑始终符合代码样式。
在保存更改时自动运行代码清理
从主菜单中选择 或按下 Alt+R O 。
转到清理配置文件设置页面: 。
转到 选项页面并选择 保存文件时自动运行清理。
或者,您可以通过文件掩码限制自动清理到特定文件。
您还可以选择 仅文件的更改部分 以确保清理仅应用于受您更改影响的代码,而文件中的其余代码不会被修改。
如果您选择仅清理文件的更改部分,您可以通过以下选项微调此行为:
如果无法执行部分清理,则执行完全清理——根据此选项,ReSharper 将清理整个文件,或者如果无法将清理限制为文件的修改部分,则跳过该文件。
允许在保存共享文件时进行清理——使用此选项启用或禁用对多次包含在解决方案中的文件(例如来自共享项目的文件)的部分清理。
单击对话框中的 保存 以应用修改,并让 ReSharper 选择保存位置,或者通过从 保存到 选择器中选择特定的设置层来保存修改。 有关更多信息,请参见 管理和共享 resharper 设置。
下次您完成编辑并保存文件( Ctrl+S )或所有文件( Ctrl+Shift+S )时,ReSharper 将使用所选配置文件清理受影响的文件。 如果未选择 默认清理配置文件 ,ReSharper 将提示您选择一个配置文件。
您还可以在最近打开或修改的文件中运行代码清理。
清理最近修改的文件
展开 ReSharper | 编辑 | 清理最近文件 处的子菜单。
选择是对所有打开的文件还是对所有最近修改的文件运行清理。
清理... 操作将提示您选择清理配置文件, 静默清理... 操作将使用在 页面的 ReSharper 选项 中选择的默认清理配置文件 Alt+R, O 。
如果您选择清理最近修改的文件,ReSharper 将对解决方案中在过去 7 天内编辑的所有文件应用所选清理配置文件。
您可以在 页面的 ReSharper 选项 Alt+R, O 中更改将更改视为最近更改的天数。
您还可以选择 仅文件的更改部分 以确保清理仅应用于受您更改影响的代码,而文件中的其余代码不会被修改。
静默清理
您还可以以静默模式运行代码清理,即不显示 代码清理 对话框。 由于在这种情况下您将无法显式选择配置文件,因此您必须为静默代码清理分配一个清理配置文件。
为静默代码清理分配一个配置文件
从主菜单中选择 或按下 Alt+R O 。
转到清理配置文件设置页面: 。
在左侧选择一个清理配置文件,然后点击 选项 页面顶部的 设为默认。
在 选项 对话框中点击 保存 以应用修改,让 ReSharper 选择保存位置,或者通过从 保存到 选择器中选择特定的设置层来保存修改。 有关更多信息,请参见 管理和共享 resharper 设置。
以静默模式运行代码清理
执行以下操作之一:
要在特定代码文件中运行静默代码清理,请在文本编辑器中打开该文件或在 解决方案资源管理器 中选择它。
要将静默代码清理应用于一组文件(目录、项目或解决方案),请选择 解决方案资源管理器 中的相应项目。
按下 Control+Shift+Alt+F 或从主菜单中选择 。 或者,您可以按 Control+Shift+A ,开始在弹窗中输入命令名称,然后从中选择它。
可用的代码清理任务
下表列出了不同语言的可用清理任务。 如果您只需要清理执行其中的一部分任务,可以为此 创建自定义清理配置文件。
重新设置代码格式
C# | |
重新设置代码格式 | 根据您可以在 页面的 ReSharper 选项 上配置的首选项重新格式化代码。 有关更多信息,请参阅 应用格式规则. |
重新格式化嵌入式 XML 文档注释 | 根据可在 页面的 ReSharper 选项 上配置的选项重新格式化 XML 文档注释。 请注意,ReSharper 不会重新格式化如下的普通注释: // A plain single-line comment
或者 /* A plain multi-line comment */
|
C++ | |
重新设置代码格式 | 根据您可以在 页面的 ReSharper 选项 上配置的首选项重新格式化代码。 有关更多信息,请参阅 应用格式规则. |
Visual Basic | |
重新设置代码格式 | 根据您可以在 页面的 ReSharper 选项 上配置的首选项重新格式化代码。 有关更多信息,请参阅 应用格式规则. |
重新格式化嵌入式 XML 文档注释 | 根据可在 页面的 ReSharper 选项 上配置的选项重新格式化 XML 文档注释。 请注意,ReSharper 不会重新格式化如下的普通注释: // A plain single-line comment
或者 /* A plain multi-line comment */
|
XML | |
重新设置代码格式 | 根据您可以在 页面的 ReSharper 选项 上配置的首选项重新格式化代码。 有关更多信息,请参阅 应用格式规则. |
HTML | |
重新设置代码格式 | 根据您可以在 页面的 ReSharper 选项 上配置的首选项重新格式化代码。 有关更多信息,请参阅 应用格式规则. |
CSS | |
重新设置代码格式 | 根据您可以在 页面的 ReSharper 选项 上配置的首选项重新格式化代码。 有关更多信息,请参阅 应用格式规则. |
JavaScript/TypeScript | |
重新设置代码格式 | 根据您可以在 页面的 ReSharper 选项 上配置的首选项重新格式化代码。 有关更多信息,请参阅 应用格式规则. |
重新格式化嵌入式 XML 文档注释 | 根据可在 页面的 ReSharper 选项 上配置的选项重新格式化 XML 文档注释。 请注意,ReSharper 不会重新格式化如下的普通注释: // A plain single-line comment
或者 /* A plain multi-line comment */
|
语法样式
C# | |
应用 'var' 样式 | 在清理过程中应用 'var' 使用规则。 这些规则可在 ReSharper 选项 的 页面 Alt+R, O 上配置。 |
对类型使用显式或隐式修饰符定义 | 应用类型修饰符规则——是否显式使用 |
对类型成员使用显式或隐式修饰符定义 | 应用类型成员修饰符规则——是否显式使用 |
排序修饰符 | 应用类型/成员修饰符的首选顺序。 这些规则可在 ReSharper 选项 的 页面 Alt+R, O 上配置。 更多信息,请参阅 代码语法样式:修饰符。 |
应用实参样式(命名与位置) | 应用特定类型参数的命名/位置参数的首选项。 这些首选项可在 页面的 ReSharper 选项 Alt+R, O 上配置。 更多信息,请参阅 代码语法样式:命名/位置参数。 |
移除多余的括号 | 移除在 页面的 ReSharper 选项 Alt+R, O 上指定的情况下的冗余可选括号。 更多信息,请参阅 代码语法样式:可选括号。 |
添加圆括号以显式指定运算优先级 | 添加可选括号以在 页面的 ReSharper 选项 Alt+R, O 上指定的情况下明确操作优先级。 更多信息,请参阅 代码语法样式:可选括号。 |
为单个语句添加/移除大括号 | 根据 页面的 ReSharper 选项 Alt+R, O 上指定的内容,添加或移除单个嵌套语句周围的可选大括号。 更多信息,请参阅 代码语法样式:单层嵌套语句的大括号。 |
为属性添加/移除方括号 | 根据 页面的 ReSharper 选项 Alt+R, O 上指定的内容,应用多个属性的规则。 更多信息,请参阅 代码语法样式:多个属性。 |
应用代码主体样式(表达式主体与块主体) | 根据 页面的 ReSharper 选项 Alt+R, O 上指定的内容,应用类型成员主体(表达式主体或块主体)的首选项。 更多信息,请参阅 代码语法样式:类型成员的主体。 |
排列尾随逗号 | 根据 页面的 ReSharper 选项 Alt+R, O 上指定的内容,应用在包含多个项的声明和类似结构(对象、数组和集合初始化器,以及枚举和 switch 表达式)中的尾随逗号的首选项。 更多信息,请参阅 代码语法样式:尾随逗号。 |
应用对象创建样式('new()' 与 'new T()') | 根据 页面的 ReSharper 选项
Alt+R, O
上指定的内容,应用在 C# 9.0 及更高版本中使用目标类型 |
应用默认值样式('default' 与 'default(T)') | 根据 页面的 ReSharper 选项 Alt+R, O 上指定的内容,应用在默认值表达式中使用可选类型指定的首选项。 更多信息,请参阅 代码语法样式:默认值表达式('default' 与 'default(T)')。 |
排列命名空间(文件作用域与块作用域) | 根据 页面的 ReSharper 选项 Alt+R, O 上指定的内容,应用在包含单个命名空间的文件中使用 文件范围命名空间声明的首选项。 有关更多信息,请参阅 代码语法样式:文件范围命名空间. |
排列 null 检查模式样式 | 根据 页面的 ReSharper 选项
Alt+R, O
上指定的内容,应用使用 类型测试 'is' 运算符 (使用 |
排列限定符 | 应用限定类型成员的规则。 这些规则可在 页面的 ReSharper 选项 Alt+R, O 上配置。 更多信息,请参阅 代码语法样式:可选成员限定符。 |
修正内置类型引用 | 应用内置类型名称(C# 关键字或 CLR 类型名称)规则。 这些规则可在 ReSharper 选项 的 页面 Alt+R, O 上配置。 更多信息,请参阅 代码语法样式:内置类型引用。 |
C/C++ | |
为单条语句添加/移除大括号 | 根据 |
应用 'auto' 样式 | 根据 页面的 ReSharper 选项
Alt+R, O
上指定的内容,应用在变量类型中使用 |
应用函数声明样式(正则与尾随返回值类型) | 根据 页面的 ReSharper 选项 Alt+R, O 上指定的内容,应用函数声明中尾随或常规返回类型的首选样式。 |
应用嵌套命名空间样式 | 应用强制使用 C++17 嵌套命名空间语法的规则,该语法允许您以更简洁的方式声明多级命名空间。 这些规则可在 ReSharper 选项 的 页面 Alt+R, O 上配置。 |
应用类型别名样式(typedef 与类型别名) | 根据 页面的 ReSharper 选项 Alt+R, O 上指定的内容,应用定义类型同义词的首选方式。 |
排列 cv 限定符 | 应用 cv 限定符的首选顺序—— |
排列 include 指令中的斜杠(正斜杠与反斜杠) | 根据 页面的 ReSharper 选项
Alt+R, O
上指定的内容,应用 |
在重写函数上排列说明符('virtual' 和/或 'override') | 应用覆盖函数的首选样式——覆盖函数和析构函数应使用哪些说明符。 这些规则可在 页面的 ReSharper 选项 Alt+R, O 上配置。 |
对 include 指令排序 | 应用排序和重新分组 |
对成员初始值设定项排序 | 根据 页面的 ReSharper 选项 Alt+R, O 上指定的内容,应用成员初始化器的顺序。 |
XAML | |
收起空标记 | 如果标签体为空,则移除结束标签。 |
HTML | |
标准化特性值周围的引号 | 根据 页面的 ReSharper 选项
Alt+R, O
上的配置,应用首选的引号样式:单引号 |
JavaScript/TypeScript | |
标准化字符串字面量周围的引号 | 根据 页面的 ReSharper 选项
Alt+R, O
上的配置,应用首选的引号样式:单引号 |
应用语句终止 | 在 JavaScript、TypeScript 和 JSON 的语句末尾添加可选的分号 |
TypeScript 特定 | |
将 'public' 状态与代码样式同步 | 此选项允许您根据 页面的 ReSharper 选项 Alt+R, O 上的配置添加或移除显式的 'public' 修饰符。 |
根据需要添加显式 'any' 类型注解 | 此选项允许您根据 页面的 ReSharper 选项 Alt+R, O 上的配置添加显式的 'any' 注解到类型。 |
将类型注解状态与代码样式同步 | 此选项允许您根据 页面的 ReSharper 选项 Alt+R, O 上的配置强制执行显式/隐式类型指定。 |
根据需要修正 'require' 中的相对路径样式 | 根据 'require' 中的相对文件引用样式 代码样式首选项,在 |
使用 'as' 代替类型断言 | 替换 var bar = <string> foo;
与 var bar = foo as string;
这是避免 JSX 语法歧义的推荐方法。 |
优化 import
C# | |
优化 'using' 指令 |
更多信息,请参阅 代码语法样式:命名空间导入。 |
在区域内包含 'using' 指令 | 如果选中此复选框,在清理期间会创建一个用于包装所有命名空间导入指令的新区域。 |
区域名称 | 允许为包装命名空间导入指令的区域指定名称。 |
缩短限定引用 | 根据您可以在 页面的 ReSharper 选项 Alt+R, O 上配置的首选项,通过导入命名空间在可能的情况下将完全限定名称替换为短名称 |
Visual Basic | |
优化 'import' 指令 |
更多信息,请参阅 代码语法样式:命名空间导入。 |
在区域内包含 'using' 指令 | 如果选中此复选框,在清理期间会创建一个用于包装所有命名空间导入指令的新区域。 |
区域名称 | 允许为包装命名空间导入指令的区域指定名称。 |
缩短限定引用 | 根据您可以在 页面的 ReSharper 选项 Alt+R, O 上配置的首选项,通过导入命名空间在可能的情况下将完全限定名称替换为短名称 |
XAML | |
移除冗余命名空间别名 | 在清理范围内移除所有冗余的命名空间别名。 冗余别名也可以通过 代码检查检测到,并可以通过快速修复移除。 |
TypeScript 特定 | |
优化 'import' 语句 | 使用此选项根据 页面的 ReSharper 选项 Alt+R, O 上的配置移除冗余的 'import' 语句或完全限定名称。 |
优化引用注释 | 使用此选项移除冗余的引用注释。 |
ASP.NET | |
优化 @Register 指令 | 移除未使用的 |
重新排列代码
C# | |
应用文件布局 | 根据您可以在 页面的 ReSharper 选项 Alt+R, O 上配置的规则,重新排序文件中的类型成员。 更多信息,请参阅 使用文件和类型布局模式重新排列成员。 |
CSS | |
按字母顺序排列属性 | 按字母顺序重新排列 CSS 属性。 |
移除冗余并应用优化
C# | |
删除代码冗余 | 在 页面的 ReSharper 选项 Alt+R, O 上,在大多数语言的 代码中的冗余 类别中,ReSharper 列出了许多与代码检查相关的情况。 其中一些需要特别注意,您无法在批处理模式下处理它们,但大多数可以在您在清理配置文件中选择 删除代码冗余 时自动修复。 |
如果可能,使用自动属性 | 将简单属性及其对应的支持字段替换为自动属性。 更多信息,请参阅 使用自动属性。 |
如果可能,将字段设为只读 | 将 |
如果可能,将自动属性设为只获取 | 移除从构造函数/初始化器初始化且没有写入用法的自动属性上的冗余 默认情况下,ReSharper 会根据关联的编译器自动检测 C# 版本。 但是,您可以明确指定目标 C# 版本 用于项目 — 在解决方案资源管理器中右键单击项目,从上下文菜单中选择 编辑项目项属性 ,并使用 C# 语言级别 选择器。 要为 解决方案中的所有项目 设置 C# 版本,请在解决方案目录中的 Directory.Build.props 文件中指定,如 此处 所述。 |
C/C++ | |
添加必需的 'typename' 和 'template' 关键字 | 添加缺失的 |
联接声明和赋值 | 在局部变量在所有路径中被读取之前重新赋值的情况下,将声明和赋值合并。 |
将局部变量设为 const | 为可以设为不可变的局部作用域对象添加 |
如果可能,将成员函数设为 'const' | 为不改变包含对象状态的成员函数添加 |
如果可能,将成员函数设为 'static' | 使成员函数 |
移除冗余转换 | 移除冗余的强制转换表达式。 |
移除冗余的 'else' 关键字 | 移除在其上下文中冗余的 |
移除冗余的详细类型说明符 | 移除冗余的详细类型说明符,当它未用于声明新类或引用被更局部的非类型声明隐藏的先前声明的结构时。 |
移除冗余的 lambda 形参列表 | 移除在无参数的 lambda 表达式中冗余的 |
移除冗余的成员初始值设定项 | 移除构造函数中与相应默认成员初始化器重复的成员初始化器。 |
移除多余的括号 | 移除在其上下文中冗余的括号。 |
移除冗余限定符 | 移除在其上下文中冗余的限定符。 |
移除冗余说明符 | 移除在其上下文中冗余的说明符。 |
移除冗余语句 | 移除在其上下文中冗余的语句。 |
移除冗余模板实参 | 移除根据 C++17 类模板参数推导规则可由语言推导出的冗余模板参数。 |
移除冗余的 'typename' 和 'template' 关键字 | 移除在其上下文中冗余的 |
移除无法访问的代码 | 移除永远不会执行的不必要代码。 |
移除未使用的 #include 指令 | 移除从未使用的 |
移除未使用的 lambda 捕获 | 如果局部变量被 lambda 捕获但未在 lambda 主体中使用,则移除未使用的捕获。 |
将 C 样式和函数样式的转换替换为 static 转换 | 将 C 风格、 |
将布尔上下文中的常量替换为布尔字面量 | 在布尔上下文中将整数常量替换为 |
将包含常量条件的 if 语句替换为 'if constexpr' | 当条件是编译时常量表达式时,将 |
将后缀运算符替换为前缀变体 | 将后缀运算符替换为其前缀变体。 |
将智能指针构造函数替换为 make 函数 | 将智能指针构造函数替换为标准( |
在可能的情况下,将 throw 表达式替换为 rethrow | 更新 |
将类型特征替换为相应的模板别名或变量模板 | 使用 C++14 别名模板简化 C++11 类型特征表达式。 |
将指针上下文中的零值表达式替换为 nullptr | 在指针上下文中将零常量替换为 |
用结构化绑定声明替换 'tie(..)' | 将 |
在可能的情况下,对关联容器使用 'contains' | 将 |
使用 'std::erase'/'std::erase_if' 替代 remove-erase 惯用法 | 将旧的 erase-remove 惯用法替换为 C++20 的 |
Visual Basic | |
删除代码冗余 | 在 页面的 ReSharper 选项 Alt+R, O 上,在大多数语言的 代码中的冗余 类别中,ReSharper 列出了许多与代码检查相关的情况。 其中一些需要特别注意,您无法在批处理模式下处理它们,但大多数可以在您在清理配置文件中选择 删除代码冗余 时自动修复。 |
XAML | |
移除冗余 'Freeze' 特性 | 移除在其上下文中冗余的 |
移除冗余修饰符特性 | 移除在其上下文中冗余的 |
移除冗余名称特性 | 移除在其上下文中冗余的 |
移除冗余资源 | 移除未使用的资源引用 |
移除冗余空集合属性 setter | |
移除冗余附加属性 setter | 移除 |
移除冗余样式属性 setter | 移除 |
移除禁止的 name 特性 | 移除在其上下文中不允许的 |
移除冗余定义 | 移除在其上下文中冗余的定义。 |
移除冗余 UpdateSourceTrigger 特性 | 移除在其上下文中冗余的 |
移除冗余 Mode 特性 | 移除在其上下文中冗余的 |
移除冗余 span 特性 | 移除在其上下文中冗余的 |
JavaScript/TypeScript | |
在可能的情况下,将 'var' 更正为 'let'/'const' |
|
将 let/const 移动到尽可能内层的作用域 | 将定义在函数/复合语句之外的变量等移动到更接近其使用的位置,如果在外部作用域中没有其他使用。 |
将字符串拼接转换为模板字符串 | 在 JavaScript 代码中,如果目标 JavaScript 语言级别是 ECMAScript 6(您可以在 页面的 ReSharper 选项 Alt+R, O 上选择),以及在 TypeScript 1.4 或更高版本中,此选项会将字符串连接转换为 模板字符串。 例如:
var str1 = "Hello,";
var str2 = "Test: " + str1 + " World1";
将被转换为
const str1 = "Hello, ";
const str2 = `Test: ${str1} World1`;
|
TypeScript 特定 | |
移除冗余限定符 | 使用此选项移除冗余的类型名称限定符。 |
运行外部清理工具
C/C++ | |
应用 Clang-tidy 修复建议 | 在此节点中,您可以选择所有或特定的修复,这些修复将根据 Clang-Tidy 检查应用。 即使在 页面的 ReSharper 选项 Alt+R, O 上关闭了相应的检查,选定的修复也会被应用。 启用过多检查时请小心——代码清理对给定文件仅运行一次 Clang-Tidy,因此如果多个修复影响同一代码块,这些更改可能会相互冲突。 |