ReSharper 2025.2 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 IntelliSense is enabled on the 环境 | IntelliSense | 常规 page of ReSharper 选项 Alt+R, O .

  • 显示后缀模板 is selected on the 代码编辑 | 后缀模板 page of ReSharper 选项 Alt+R, O .

To disable specific postfix templates, clear the corresponding check-boxes on the 代码编辑 | 后缀模板 page of ReSharper 选项 Alt+R, O .

要在完成列表中隐藏模板或相反隐藏所有其他项目,请使用 完成过滤器

后缀模板列表

快捷方式

描述

示例

.arg

用调用包围表达式

Method(expr)

.await

等待 'Task' 类型的表达式

await expr

.cast

用类型转换包围表达式

((SomeType) expr)

.else

检查布尔表达式是否为“false”

if (!expr)

.field

为表达式引入字段

_field = expr;

.for

使用索引遍历集合

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

.foreach

遍历可枚举集合

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

.notnull

检查表达式是否非 null

if (expr != null)

.null

检查表达式是否为 null

if (expr == null)

.用括号包围当前表达式

用括号包围当前表达式

(expr)

.parse

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

int.Parse(expr)

.prop

为表达式引入属性

Property = expr;

.return

从当前函数返回表达式

return expr;

.sel

在编辑器中选择表达式

|selected + expression|

.switch

生成 switch 语句

switch (expr)

.throw

抛出 'Exception' 类型的表达式

throw expr;

.to

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

lvalue = expr;

.tryparse

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

int.TryParse(expr, out value)

.typeof

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

typeof(TExpr)

.using

用 using 语句包裹资源

using (expr)

.var

为表达式引入变量

var x = expr;

.while

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

while (expr)

.yield

从迭代器方法中生成值

yield return expr;

快捷方式

描述

示例

.beg..end

从范围生成迭代器

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

.Cast

用 UE 类型转换环绕表达式

Cast<SomeType>(expr)

.cbeg..cend

从范围生成迭代器

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

.co_await

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

co_await expr

.co_return

从当前协程返回表达式

co_return expr;

.co_yield

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

co_yield expr

.const_cast

用 const_cast 环绕表达式

const_cast<SomeType &>(expr)

.do

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

do { } while (expr);

.dynamic_cast

用 dynamic_cast 环绕表达式

dynamic_cast<SomeType &>(expr)

.else

检查布尔表达式是否为“false”

if (!expr)

.foreach

遍历范围

for (auto && x : range)

.forward

转发函数参数

std::forward<Arg>(arg)

.if

检查布尔表达式是否为“true”

if (expr)

.make_shared

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

std::make_shared<SomeType>()

.make_unique

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

std::make_unique<SomeType>()

.new

生成类型的实例化表达式

new SomeType()

.reinterpret_cast

用 reinterpret_cast 环绕表达式

reinterpret_cast<SomeType &>(expr)

.return

从当前函数返回表达式

return expr;

.safe_cast

用 safe_cast (C++/CLI) 环绕表达式

safe_cast<SomeType>(expr)

.static_cast

用 static_cast 环绕表达式

static_cast<SomeType>(expr)

.switch

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

switch (expr)

.var

为表达式引入变量

auto x = expr;

.while

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

while (expr)

快捷方式

描述

示例

.else

检查布尔表达式是否为“false”

if (!expr)

.forof

遍历可迭代对象

for (let x of expr)

.if

检查布尔表达式是否为“true”

if (expr)

.notnull

检查表达式是否非 null

if (expr !== null)

.notundefined

检查表达式是否非 undefined

if (expr !== undefined)

.null

检查表达式是否为 null

if (expr === null)

.return

从当前函数返回表达式

return expr;

.undefined

检查表达式是否为 undefined

if (expr === undefined)

.var

为表达式引入变量

var x = expr;

快捷方式

描述

示例

.else

检查布尔表达式是否为“false”

if (!expr)

.forof

遍历可迭代对象

for (let x of expr)

.if

检查布尔表达式是否为“true”

if (expr)

.instanceof

检查表达式的实例

if (x instanceof Class)

.notnull

检查表达式是否非 null

if (expr !== null)

.notundefined

检查表达式是否非 undefined

if (expr !== undefined)

.null

检查表达式是否为 null

if (expr === null)

.return

从当前函数返回表达式

return expr;

.typeof

检查表达式的类型

if (typeof x === 'string')

.undefined

检查表达式是否为 undefined

if (expr === undefined)

.var

为表达式引入变量

let x = expr;

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

语言:C#

语言:VB.NET

语言:C++

语言:ASP.NET

语言:Razor

语言:XAML

语言:Resx

语言:构建脚本

语言:SQL

此功能在 C# 中可用

此功能在 Visual Basic 中不可用

此功能在 C++ 中可用

此功能在 ASP.NET 中不可用

此功能在 Razor 中不可用

此功能在 XAML 中不可用

此功能在资源文件中不可用

此功能在构建脚本文件中不可用

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

最后修改日期: 2025年 9月 27日