代码语法样式:隐式/显式类型('var' 关键字)
使用 隐式类型的局部变量 (也称为 var 关键字),自 C# 3.0 引入以来,因其在许多场景中提高了可读性而变得非常流行。 默认情况下,ReSharper 也鼓励使用 var 关键字,但其使用偏好是 灵活可配置的——例如,您可以选择在特定情况下或所有情况下使用显式类型,ReSharper 将帮助您执行您的偏好。
从 C# 7.0 开始,您可以在 解构元组时声明局部变量。 如果您更喜欢在此类声明中使用 var ,您还可以配置样式以使用合并或分离的表示法,例如: var (x, y) = GetTuple(); 或 (var x, var y) = GetTuple();。
另一个 C# 7.0 功能是 丢弃 ,它还允许使用 var 以确保与作用域中可能命名为 _ 的变量没有冲突。 ReSharper 允许您配置样式以在适当的情况下始终与丢弃一起使用 var。
强制执行使用 'var' 关键字的偏好设置
ReSharper 检查所有局部变量是否符合您的 偏好设置 ,如果它们不符合,ReSharper 会 高亮显示此类声明,并建议相应的 快速修复或 范围修复。
默认情况下,ReSharper 的偏好设置表明更倾向于使用 'var' 关键字:

如果您更改了偏好设置,ReSharper 将帮助您使用显式类型:

另一种以批量模式强制执行 'var' 关键字使用偏好设置的选项是 代码清理。 您可以使用内置配置文件之一 完全清理或 重新格式化并应用语法样式运行 代码清理 ,或者创建并运行 仅针对您特定任务的自定义配置文件 ,如下所述。
使用自定义代码清理配置文件应用 'var' 关键字的偏好设置
从主菜单中选择 或按下 Alt+R O 。
转到清理配置文件设置页面: 。
按照 创建新的自定义清理配置文件 部分中的描述创建一个新配置文件。 在右侧的配置文件首选项中,展开 节点并选中 应用 'var' 样式 复选框。
在 选项 对话框中点击 保存 以应用修改,让 ReSharper 选择保存位置,或者通过从 保存到 选择器中选择特定的设置层来保存修改。 有关更多信息,请参见 管理和共享 resharper 设置。
选择要强制执行偏好设置的范围:
将光标放置在文件中的任意位置,以对整个文件强制执行您的偏好设置。
在 解决方案资源管理器 中选择一个或多个项目,以对这些节点及其子项目下的文件强制执行您的偏好。
执行以下操作之一:
按下 Control+Alt+F 或从主菜单中选择 。
右键单击文本编辑器中的任意位置或右键单击选定内容,并在上下文菜单中选择 清理代码。
在打开的 代码清理 对话框中,选择新创建的配置文件。
单击 运行。 ReSharper 将在选定范围内强制执行您的偏好。
如果您希望在不打开 代码清理 对话框选择配置文件的情况下强制执行 'var' 关键字使用偏好设置,可以将创建的配置文件绑定到 静默清理 ,并通过按 Control+Shift+Alt+F 运行它。 您还可以创建一个 自定义清理配置文件 ,将应用偏好与其他代码样式任务结合起来。
要将 'var' 关键字使用偏好设置与所有其他 格式化和 语法样式规则一起应用于选定的代码块,请 Alt+Enter 并选择 。
您可以在每次保存文件更改时强制执行 'var' 关键字使用偏好设置,以确保您的编辑始终符合代码样式。
在保存更改时自动强制执行 'var' 关键字使用的偏好设置
从主菜单中选择 或按下 Alt+R O 。
转到清理配置文件设置页面: 。
选择您的自定义代码清理配置文件并单击 设为默认 (默认配置文件也用于 静默清理)。
转到 选项页面并选择 保存文件时自动运行清理。
或者,您可以通过文件掩码限制自动清理到特定文件。
您还可以选择 仅文件的更改部分 以确保清理仅应用于受您更改影响的代码,而文件中的其余代码不会被修改。
如果您选择仅清理文件的更改部分,您可以通过以下选项微调此行为:
如果无法执行部分清理,则执行完全清理——根据此选项,ReSharper 将清理整个文件,或者如果无法将清理限制为文件的修改部分,则跳过该文件。
允许在保存共享文件时进行清理——使用此选项启用或禁用对多次包含在解决方案中的文件(例如来自共享项目的文件)的部分清理。
单击对话框中的 保存 以应用修改,并让 ReSharper 选择保存位置,或者通过从 保存到 选择器中选择特定的设置层来保存修改。 有关更多信息,请参见 管理和共享 resharper 设置。
下次您完成编辑并保存文件( Ctrl+S )或所有文件( Ctrl+Shift+S )时,ReSharper 将使用所选配置文件清理受影响的文件。 如果未选择 默认清理配置文件 ,ReSharper 将提示您选择一个配置文件。
配置使用 'var' 关键字的偏好设置
您的 'var' 关键字使用偏好设置是通过 基于层的设置机制保存的。 除此之外,此机制还允许您为不同的解决方案维护不同的偏好,并将这些偏好保存在 VCS 中并自动与您的团队成员共享。
在选项对话框中配置使用 'var' 关键字的偏好设置
转到 ReSharper 选项 的 页面 Alt+R, O 。
根据您的编码实践/标准修改 声明中的 'var' 用法 类别中的设置。
您可以为不同类型设置使用 'var' 或显式类型的不同偏好:
对于内置类型——适用于 C# 内置类型。
对于简单类型——适用于没有泛型参数的类型。
其他位置——适用于泛型类型和解构声明。
对于这些偏好中的每一个,您可以选择使用 'var'、显式类型或 显而易见时使用 'var'。
如果您在上一步中选择了 在明显时使用 'var' ,您可以选择应用 Visual Studio 逻辑来决定哪些情况应被视为显而易见。
要了解 ReSharper 和 Visual Studio 逻辑之间的差异,请参阅 在显而易见时使用 'var':什么被认为是显而易见的?。
默认情况下,ReSharper 会建议在 解构声明中对多个
var使用合并表示法,例如var (x, y) = GetTuple();。 您可以选择 为析构变量首选单独的声明 以选择单独表示法,例如(var x, var y) = GetTuple();。默认情况下,ReSharper 建议为 丢弃使用独立的
_,例如(_, _) = (0, 1);。 您可以选择 将 'var' 关键字用于弃元 以始终在适当的情况下对丢弃使用var,从而确保不会与范围内可能命名为_的变量发生冲突。在 选项 对话框中点击 保存 以应用修改,让 ReSharper 选择保存位置,或者通过从 保存到 选择器中选择特定的设置层来保存修改。 有关更多信息,请参见 管理和共享 resharper 设置。
您还可以直接在编辑器中更改使用 'var' 关键字的偏好设置,其中相应的问题已被高亮显示:
从编辑器更改使用 'var' 关键字的偏好设置
在显而易见时使用 'var':什么被认为是显而易见的?
在 配置使用 'var' 关键字与显式类型的偏好时,您可以选择 在明显时使用 'var'。 此选项看起来不言自明,但在某些情况下,可能不清楚什么被认为是“显而易见的”,什么不是。
除此之外,ReSharper 和 Visual Studio 在建议使用 'var' 关键字或显式类型时,对“显而易见”的定义也存在一些差异。
下表显示了在什么情况下可以声明为 'var' 的初始化器在 ReSharper 选项 Alt+R, O 的 页面上 为类型证据首选 Roslyn (Visual Studio)逻辑 复选框的状态下被视为显而易见。
初始化表达式 | 示例 | 关闭 | 开启 |
|---|---|---|---|
对象创建表达式 |
| 显而易见 | 显而易见 |
类型转换表达式 |
| 显而易见 | 显而易见 |
|
| 显而易见 | 显而易见 |
文字表达式 |
| 显而易见 | 显而易见 |
默认表达式 |
| 显而易见 | 显而易见 |
元组表达式 |
| 当所有组件表达式都显而易见时显而易见 | |
显式数组创建表达式 |
| 显而易见 | 显而易见 |
隐式数组创建表达式 |
| 当所有元素初始化器(最多 42 个)显而易见时显而易见 | 不显而易见 |
非泛型工厂(创建)方法(在某种类型中声明的静态方法并返回相同类型的值) |
| 当方法名称包含父类型名称或以下子字符串之一时显而易见:"Create"、"Build"、"Construct"、"Make"、"Generate"、"Produce"、"New"、"Instance" | 显而易见 |
泛型工厂(创建)方法(返回泛型类型并在与返回类型同名的类中声明的静态方法) |
| 当所有方法调用参数显而易见且方法名称包含以下子字符串之一或类名时显而易见:"Create"、"Build"、"Construct"、"Make"、"Generate"、"Produce"、"New"、"Instance" | 显而易见 |
转换方法(名称由 "To" 加上返回类型名称组成的方法) |
| 当返回类型不是泛型时显而易见 | 显而易见 |
具有显式类型参数并返回该类型参数值的泛型方法 |
| 显而易见 | 不显而易见 |
枚举成员 |
| 显而易见 | 不显而易见 |
单例字段(静态/常量字段返回其声明类型的值) |
| 当字段名称包含类型名称或以下子字符串之一时显而易见:"Empty"、"Instance"、"Default"、"Value" | 不显而易见 |
在不同语言中的适用性
此功能在以下语言和技术中是 支持的:
此处提供的说明和示例介绍了在 C# 中使用该功能。 有关其他语言的更多信息,请参阅 语言和框架 部分中的相关主题。
