使用文件和类型布局模式重新排列成员
ReSharper 可以根据不同的模式重新排序 C# 文件中的类型和类型成员。 模式可以描述许多条件和约束,这些条件和约束在重新排序文件中的项目和/或用指定区域包裹它们时会被评估。
布局模式简介
您可以配置多个布局模式以应用于不同的上下文(例如,您可以为类和接口设置不同的模式)。 有两种类型的模式:
文件模式。 适用于所有 C# 文件。 可以排列命名空间、类型和委托;将它们包裹在区域中或组织成组,移除区域。 类型的内容可以通过类型模式进一步排列。 请注意,一次只能应用一个文件模式。
类型模式。 仅适用于符合模式约束的类型(如果有)。 可以排列文件成员,将它们包裹在区域中或组织成组,移除区域,排序等。
在模式中,您可以按所需顺序指定匹配项条目和代码片段,以及将匹配项包裹/分组到的区域/组。
应用当前模式集的算法如下:
如果存在文件模式,ReSharper 会检查文件中的区域是否需要移除,然后检查模式中的每个匹配项条目或代码片段是否匹配文件中的任何代码项。
如果有匹配的条目,它们在文件中的位置会根据文件模式中相应匹配项的顺序进行更改。
如果同一个代码项匹配多个匹配项条目,则优先应用优先级更高或约束更强的匹配项。 也就是说,如果有模式 A 匹配公共类型,模式 B 匹配公共静态类型,那么所有公共静态类型将由模式 B 匹配。 要更改此行为,您可以提高模式 A 的优先级。
如果有多个具有相同约束集的匹配项条目,匹配的项将根据第一个此类匹配项条目的位置进行移动。
如果指定了区域或组,匹配的项将相应地分组或包裹在这些区域中。
组或区域允许您为其指定优先级。 例如,如果组/区域的优先级高于其外部的其他匹配项,则 ReSharper 会先处理组/区域内的匹配项,然后再处理其余的匹配项。 组和区域之间的唯一区别是区域将匹配的项包裹在
#region/#endregion中。所有未匹配的项都会被移动到匹配项之后。 如果您需要将未匹配的项放置在其他位置,可以创建一个没有约束的匹配项,并在模式中为其设置所需的位置。
之后,将应用类型模式(如果有)。 ReSharper 会检查文件中的每个类型模式是否匹配任何类型。 如果某个类型有多个匹配的模式,冲突将类似于步骤 3 和 4 的方式解决。
当类型匹配确定后,ReSharper 会检查类型中的区域是否需要移除;然后检查模式中的每个匹配项条目是否匹配文件中的任何成员。
如果有匹配的成员,它们在类型中的位置会根据类型模式中相应匹配项的顺序进行更改。
区域、组和未匹配的成员的处理方式与步骤 5 和 6 类似。
文件和类型布局偏好设置
开箱即用,ReSharper 提供了几个针对性的类型模式(例如,用于 NUnit 测试夹具),以及其余 C# 类型的默认模式。
默认的成员布局规则基于众多最佳实践,在大多数情况下都可以推荐使用。 但是,如果您的个人偏好或公司标准与 ReSharper 的默认设置不同,您可以基于默认模式配置代码重新排序模式,也可以为特定情况创建新模式。
All modifications to the layout patterns are done in the page of ReSharper 选项 Alt+R, O . 编辑完成后,单击 选项 对话框中的 保存 应用修改,让 ReSharper 选择保存位置,或者通过从 保存到 选择器中选择特定的设置层来保存修改。 有关更多信息,请参见 管理和共享 resharper 设置。
通过可视化方式配置文件和类型布局规则
ReSharper 允许您使用专用的可视化编辑器配置布局规则的所有参数。 编辑器页面中的项目可以以以下视图之一显示:
模式。 这是一个根视图,显示当前模式集中所有可用的模式。 您可以通过单击页面左上角的 模式 打开此视图。 在此视图中,您可以通过双击导航到任何模式。 要向集合中添加新模式,请从右侧工具箱中拖放一个文件或类型模式项。 您还可以使用拖放功能重新排序模式。 类型模式的顺序决定了当多个模式以相同的优先级和约束匹配同一类型时,应用哪个模式。
组成。 此视图可视化模式、区域或组内匹配项条目、区域和组的顺序和分组。 在下图中,您可以看到一个类型模式的组成视图:

约束。 此视图可视化模式或匹配项条目的约束,例如应匹配或不应匹配哪些具有特定修饰符或属性的代码项等。 模式和匹配项仅适用于匹配其所有约束的项。 所有约束都按逻辑容器分组,这些容器标识这些约束之间的关系。 在下图中,您可以看到一个匹配项条目的约束视图:

编辑现有的布局模式
从主菜单中选择 或按 Alt+R O ,然后在左侧选择 。
单击页面左上角的 模式 查看当前集合中的所有模式。 在此元素的属性中,您可以使用 static 字段重新排序策略 选择器定义是否以及如何重新排序带有初始化器的静态字段。 选项包括:
严格 — 如果可能影响程序行为,则不会重新排序静态字段。 例如,如果有一个静态字段的初始化器引用了同一类的静态成员,则该类的 所有静态字段 都不会被重新排序。
宽松 — 禁止重新排序在初始化器中显式使用其他静态字段的静态字段以及它们引用的静态字段。
无限制 — 始终允许重新排序(不推荐)。
所选行为将应用于所有模式。
对于未重新排序的带有初始化器的静态字段,ReSharper 会保留它们的相对顺序,同时仍将它们与其他声明一起重新排序。
可选地,要加载默认模式集之一,请单击页面右上角的 加载 ,然后选择模式集。
双击所需的模式,如果它处于约束视图中,则切换到组成视图(单击模式标题右侧的图标以切换视图)。 请注意,文件模式始终以组成视图显示,也就是说,您无法为其指定任何约束。
在组成视图中,您可以通过以下方式修改模式:
要更改项目的顺序,请将它们拖动到模式内。
要移除特定项目,请选择它,然后按 Delete 。 请注意,如果您正在删除一个区域或组,则其中的所有项目也会被删除。 因此,您可能需要在删除之前将项目从区域/组中拖出。
要添加新项目,请将其从 工具箱 区域拖动到模式中的所需位置。 拖动 区域 或 组 以将其用作分组项目,或拖动 条目 以匹配目标代码中的某些内容。
您还可以使用 依赖项属性 匹配器匹配和排列 WPF 依赖属性的所有部分,并使用 带支持字段的属性 匹配器将属性的后备字段直接排列在相应属性声明之前或之后。
要配置模式或其中项目的属性,请选择它并在右下部分修改其属性:
- 显示名称
此属性适用于模式和匹配项条目,仅供您方便使用,应该描述其匹配的内容。
- 名称
区域的此属性指定创建区域时如何命名区域。
您可以在名称中使用
${0}参数,以插入区域的序列号(如果区域是根据 分组依据 选项生成的)。您还可以使用命名参数在区域名称中插入分组选项。 例如,您可以使用
${Access}参数,该参数将被替换为private、public等等,以命名相应区域。 显然,如果您为区域的 分组依据 属性使用相同的值,则此参数才有意义。 此参数的有效值与 分组依据 属性的值相同,但不包含空格。 也就是说,要在区域名称中插入实现接口的名称,请使用${ImplementsInterface}参数。您还可以通过 项目名称的部分匹配 生成区域名称。
- 移除区域
文件和类型模式的此属性指定如何处理匹配代码中的现有区域。 除生成的 值可用于仅移除通过应用此功能和默认模式先前创建的区域。
- 优先级
此属性设置匹配项条目的相对优先级。 也就是说,如果某段代码被多个匹配项条目匹配,它将根据优先级最高的条目的位置进行移动。
- 排序依据
条目的此属性指定在多个匹配代码项的情况下的排序偏好。 一旦选择了 无 以外的排序偏好,就会出现一个 Then By 子句,允许进一步细化排序顺序。
- 分组依据
区域或组的此属性指定是否根据指定的分组生成区域/组。 例如,如果选择 种类 作为值,则会为字段、属性和其他类型的成员(如果有)创建多个区域/组。 一旦选择了 无 以外的分组偏好,就会出现一个 Then By 子句,允许进一步分离匹配的代码项。
要配置定义特定类型模式或匹配项条目如何匹配代码项的约束,我们切换到约束视图。 要打开类型模式的此视图,请单击其标题上的相应图标;要打开匹配项条目的此视图,请双击它。
在约束视图中,所选项目表示为条件的容器。 要配置这些条件,请将项目从 工具箱 区域拖动到编辑的模式或条目中:
逻辑容器 中的项目应首先添加,因为它们定义了如何应用多个条件。 这些容器的名称非常清楚地解释了这些条件在容器内的关系。 如果您添加了没有逻辑容器的约束,它们将被 And 容器分组。
约束 组中的项目允许您定义匹配项应该或不应该是什么(如果包裹在 非 容器中)。
请注意,您可以在 名称 约束的值中使用正则表达式,例如,
MyTest.*将匹配名称为MyTest_One、MyTest_Two、MyTest_Three等的项目。将此组中的项目拖动到逻辑容器中,并在右下部分配置其属性。
从 修饰符 组中拖动项目以指定目标项应该或不应该具有哪些修饰符。
例如,一个匹配非私有静态字段和属性的条目将如下所示:

通过编辑源 XAML 配置文件和类型布局
如有必要,您可以编辑描述文件和类型模式集的源 XAML。 为此,请单击 XAML 位于 文件布局 页面顶部。 此视图还可以帮助您复制和粘贴模式集。
我们建议您加载一个默认模式并检查此格式中使用的标签。 它们相当直观,例如, Entry 标签定义了一个匹配项条目,而 Entry.Match 指定了应匹配哪些代码项。 Entry.SortBy 标签指定了匹配项的排序方式,等等。 请看以下示例:

此 XAML 代码匹配构造函数,并以静态构造函数优先的方式对其进行排序。
场景:通过部分名称匹配将项目分组到区域中
考虑一个类,其中所有方法都以 测试 开头,然后其中一些具有一个公共子字符串,其他的具有另一个子字符串,依此类推:
您可以使用类型布局将每组方法包裹在一个区域中,并使用公共子字符串作为区域名称。
为此,请在区域名称字段中指定 ${Name} ,并在条目中添加以下正则表达式值的 名称 约束: test\w+?_.*。

或者,您可以在 XAML 视图中添加以下模式:
在类上 应用布局后,方法将被排序并包裹在相应的区域中:
重新排序文件和类型成员
要在所需范围内应用您的文件和类型布局设置,请使用 运行代码清理与 内置:完全清理配置文件,或创建并运行 自定义配置文件 ,仅针对您的特定任务,如下所述。
使用自定义代码清理配置文件应用文件和类型布局
从主菜单中选择 或按 Alt+R O 。
转到代码清理配置文件设置页面: 。
按照 创建新的自定义清理配置文件 部分的描述创建一个新配置文件。 在新配置文件的 选定的配置文件设置 部分中,勾选 应用文件布局 复选框。 可选地,您可以在此配置文件中启用其他代码清理任务。
单击 选项 对话框中的 保存 应用修改,让 ReSharper 选择保存位置,或者通过从 保存到 选择器中选择特定的设置层来保存修改。 有关更多信息,请参见 管理和共享 resharper 设置。
选择您想要应用文件布局的范围:
将光标放置在文件中的任意位置以对文件应用文件布局。
在 解决方案资源管理器 中选择一个或多个项目,以在这些节点及其子项下的文件中应用文件布局。
执行以下操作之一:
按 Control+Alt+F 或从主菜单中选择 。
右键单击文本编辑器中的任意位置或右键单击选定内容,然后在上下文菜单中选择 清理代码。
在打开的 代码清理 对话框中,选择新创建的配置文件。
单击 运行。 ReSharper 将在选定范围内应用文件布局。
如果您想在不打开 代码清理 对话框选择配置文件的情况下应用文件布局,可以将创建的配置文件绑定到 静默清理 ,并通过按 Control+Shift+Alt+F 运行它。 您还可以创建一个 自定义清理配置文件 ,将文件布局应用与其他代码样式任务结合起来。
在特定类型中禁用成员重新排序
如果您希望在清理期间重新排序成员,但希望保留特定类型中的原始成员顺序,请使用 [NoReorder] 属性标记这些类型,该属性来自 JetBrains.Annotations。
此功能在以下语言和技术中 受支持: