ReSharper 2025.3 Help

后缀模板

后缀模板帮助您转换已输入的表达式,而无需向后跳转——只需在表达式后输入一个点,然后从 完成列表中选择一个模板。

应用后缀模板

后缀模板最简单的示例之一是对布尔表达式取反。 假设您刚刚输入了一个布尔表达式,然后意识到比较逻辑应该反转。 通常,您需要将光标移回并将 == 更改为 != 或反之,然后返回到原来的位置。 使用 ReSharper,您只需继续输入 .not 并按下 输入

您可以使用 更多的后缀模板来加速编码。 例如,您可以将当前表达式用 ifwhilelockusing 包裹起来,在当前表达式前添加 returnyield returnawait ,遍历集合,生成 switch 语句,将表达式转换为特定类型,甚至为表达式引入字段或属性。

后缀模板甚至可以改变您的输入习惯。 考虑下面的 CheckInput 方法,想象您将如何输入空值检查子句。

private void CheckInput(string input) { if (input == null) { throw new ArgumentNullException("The input is null"); } // do something with 'input' }

现在让我们看看如何使用后缀模板完成此操作。

当您的光标位于方法体内时,您可以立即开始输入 input ,因为这是您想要检查的内容。 当 input 出现时,只需继续输入 .null——一个用于检查 null 的后缀模板:

应用用于空值检查的后缀模板

这将比较 inputnull ,并将比较包裹在 if 语句中,并将光标放置在可以继续输入的位置:

应用用于空值检查的后缀模板

现在,您可以直接输入异常类名,而不是输入 throw ,并在其后调用 .throw 模板:

应用用于空值检查的后缀模板

应用此模板后,您将获得完整的 throw 语句,并将光标放置在输入参数的位置:

应用用于空值检查的后缀模板

您可以看到,与手动输入常用的语言结构相比,在许多情况下,您只需输入模板快捷方式的几个初始字符,就可以将所有内容正确格式化并放置到位,无需拼写错误。

应用一个后缀模板

  1. 在当前表达式后输入一个点,并在完成列表中检查所需的模板。

  2. 如果您知道要应用的模板快捷方式,请开始输入——这将缩小建议列表。

  3. 根据当前上下文,某些后缀模板可能不会包含在完成列表中。 如果您没有看到所需的模板,但仍想使用它,请按 Control+Space 两次以在完成列表中查看所有模板。

  4. 一旦在建议列表中选择了所需的模板,请按 输入

  5. 如果模板具有 可编辑参数 (即需要用户输入),ReSharper 会在编辑器中启动 热点会话 ,并将输入位置设置为第一个参数。 然后,您可以执行以下操作:

    • 如果 ReSharper 为当前参数建议了一些值,请使用 箭头键浏览建议值列表,或者直接键入所需的值。

    • 标签页 输入 接受该值并移动到下一个参数的输入位置。 如果这是最后一个参数,热点会话将完成,光标会移动到为会话定义的结束位置。

    • Shift+Tab 将输入焦点移动到上一个参数的输入位置。

    • Esc 退出热点会话。 在这种情况下,所有会话参数将使用默认值进行初始化。

配置后缀模板

后缀模板默认启用。 它们会出现在完成列表中,如果:

  • 已在 ReSharper 选项 Alt+R, O 环境 | IntelliSense | 常规 页面启用 ReSharper IntelliSense 。

  • 已在 ReSharper 选项 Alt+R, O 代码编辑 | 后缀模板 页面选择 显示后缀模板

要禁用特定的后缀模板,请在 ReSharper 选项 Alt+R, O 代码编辑 | 后缀模板 页面清除相应的复选框。

要隐藏补全列表中的模板或相反隐藏所有其他项,请使用 补全过滤器

后缀模板列表

快捷键

注释

示例

.arg

用调用包裹表达式

Method(expr)

.await

等待 'Task' 类型的表达式

await expr

用 UE 类型转换包裹表达式

用类型转换包裹表达式

((SomeType) expr)

检查布尔表达式是否为 'false'

检查布尔表达式是否为 'false'

if (!expr)

.field

为表达式引入字段

_field = expr;

.for

使用索引遍历集合

for (var i = 0; i < xs.Length; i++)

遍历

遍历可枚举集合

foreach (var x in expr)

.forr

以索引反向遍历集合

for (var i = xs.Length-1; i >= 0; i--)

.if

检查布尔表达式是否为 'true'

if (expr)

.inject

引入类型的主构造函数参数

class Component(IDependency dependency)

.lock

用锁块包裹表达式

lock (expr)

.new

生成类型的实例化表达式

new SomeType()

.not

取反布尔表达式

!expr

检查表达式是否非空

检查表达式是否非空

if (expr != null)

检查表达式是否为空

检查表达式是否为空

if (expr == null)

用括号包裹当前表达式

用括号包裹当前表达式

(expr)

解析

将字符串解析为某种类型的值

int.Parse(expr)

为表达式引入属性

为表达式引入属性

Property = expr;

返回

从当前函数返回表达式

return expr;

选择

在编辑器中选择表达式

|selected + expression|

生成 switch 语句

生成 switch 语句

switch (expr)

抛出

抛出 'Exception' 类型的表达式

throw expr;

将当前表达式赋值给某个变量

将当前表达式赋值给某个变量

lvalue = expr;

尝试解析

将字符串解析为某种类型的值

int.TryParse(expr, out value)

检查表达式的类型

用 typeof() 表达式包裹类型用法

typeof(TExpr)

用 using 语句包裹资源

用 using 语句包裹资源

using (expr)

为表达式引入变量

为表达式引入变量

var x = expr;

.while

当布尔语句为 'true' 时迭代

while (expr)

从迭代器方法返回值

从迭代器方法返回值

yield return expr;

快捷键

注释

示例

生成范围的迭代器

生成范围的迭代器

sort(range.begin(), range.end())

用 UE 类型转换包裹表达式

用 UE 类型转换包裹表达式

Cast<SomeType>(expr)

生成范围的迭代器

生成范围的迭代器

is_sorted(range.cbegin(), range.cend())

将表达式作为参数传递给 co_await

将表达式作为参数传递给 co_await

co_await expr

从当前协程返回表达式

从当前协程返回表达式

co_return expr;

将表达式作为参数传递给 co_yield

将表达式作为参数传递给 co_yield

co_yield expr

用 const_cast 包裹表达式

用 const_cast 包裹表达式

const_cast<SomeType &>(expr)

迭代直到布尔表达式变为 'false'

迭代直到布尔表达式为 'false'

do { } while (expr);

用 dynamic_cast 包裹表达式

用 dynamic_cast 包裹表达式

dynamic_cast<SomeType &>(expr)

检查布尔表达式是否为 'false'

检查布尔表达式是否为 'false'

if (!expr)

遍历

遍历范围

for (auto && x : range)

转发

转发函数参数

std::forward<Arg>(arg)

.if

检查布尔表达式是否为 'true'

if (expr)

构造对象并将其包装在 std::shared_ptr 中

构造对象并将其包装在 std::shared_ptr 中

std::make_shared<SomeType>()

构造对象并将其包装在 std::unique_ptr 中

构造对象并将其包装在 std::unique_ptr 中

std::make_unique<SomeType>()

.new

生成类型的实例化表达式

new SomeType()

用 reinterpret_cast 包裹表达式

用 reinterpret_cast 包裹表达式

reinterpret_cast<SomeType &>(expr)

返回

从当前函数返回表达式

return expr;

用 safe_cast 包裹表达式

用 safe_cast 包裹表达式(C++/CLI)

safe_cast<SomeType>(expr)

用 static_cast 包裹表达式

用 static_cast 包裹表达式

static_cast<SomeType>(expr)

生成 switch 语句

生成针对整数/枚举类型的 switch 语句

switch (expr)

为表达式引入变量

为表达式引入变量

auto x = expr;

.while

当布尔表达式为 'true' 时迭代

while (expr)

快捷键

注释

示例

检查布尔表达式是否为 'false'

检查布尔表达式是否为 'false'

if (!expr)

.forof

遍历可迭代对象

for (let x of expr)

.if

检查布尔表达式是否为 'true'

if (expr)

检查表达式是否非空

检查表达式是否非空

if (expr !== null)

检查表达式是否非未定义

检查表达式是否非未定义

if (expr !== undefined)

检查表达式是否为空

检查表达式是否为空

if (expr === null)

返回

从当前函数返回表达式

return expr;

检查表达式是否未定义

检查表达式是否未定义

if (expr === undefined)

为表达式引入变量

为表达式引入变量

var x = expr;

快捷键

注释

示例

检查布尔表达式是否为 'false'

检查布尔表达式是否为 'false'

if (!expr)

.forof

遍历可迭代对象

for (let x of expr)

.if

检查布尔表达式是否为 'true'

if (expr)

检查表达式的实例

检查表达式的实例

if (x instanceof Class)

检查表达式是否非空

检查表达式是否非空

if (expr !== null)

检查表达式是否非未定义

检查表达式是否非未定义

if (expr !== undefined)

检查表达式是否为空

检查表达式是否为空

if (expr === null)

返回

从当前函数返回表达式

return expr;

检查表达式的类型

检查表达式的类型

if (typeof x === 'string')

检查表达式是否未定义

检查表达式是否未定义

if (expr === undefined)

为表达式引入变量

为表达式引入变量

let x = expr;

此功能在以下语言和技术中是 支持的

语言:C#

语言:VB.NET

语言:C++

语言:ASP.NET

语言:Razor

语言:XAML

语言:Resx

语言:构建脚本

语言:SQL

功能在 C# 中可用

此功能在 Visual Basic 中不可用

功能在 C++ 中可用

功能在 ASP.NET 中不可用

功能在 Razor 中不可用

功能在 XAML 中不可用

此功能不适用于资源文件

此功能不适用于构建脚本文件

功能在 SQL/NoSQL 文件和注入中不可用

最后修改日期: 2025年 12月 8日