后缀模板
后缀模板帮助您在不向后跳转的情况下转换已键入的表达式——只需在表达式后键入一个点,然后从 自动完成列表中选择一个模板。
应用后缀模板
后缀模板最简单的示例之一是对布尔表达式取反。 假设您刚刚输入了一个布尔表达式,然后意识到比较逻辑应该反转。 通常,您需要将光标移回并将 == 更改为 != 或反之,然后返回到原来的位置。 使用 ReSharper,您只需继续输入 .not 并按下
输入
。
您可以使用 更多的后缀模板来加速编码。 例如,您可以将当前表达式用 if、 while、 lock、 using 包裹起来,在当前表达式前添加 return、 yield return、 await ,遍历集合,生成 switch 语句,将表达式转换为特定类型,甚至为表达式引入字段或属性。
后缀模板甚至可以改变您的输入习惯。 考虑下面的 CheckInput 方法,想象您将如何输入空值检查子句。
现在让我们看看如何使用后缀模板完成此操作。
当您的光标位于方法体内时,您可以立即开始输入 input ,因为这是您想要检查的内容。 当 input 出现时,只需继续输入 .null——一个用于检查 null 的后缀模板:

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

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

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

您可以看到,与手动输入常用的语言结构相比,在许多情况下,您只需输入模板快捷方式的几个初始字符,就可以将所有内容正确格式化并放置到位,无需拼写错误。
应用一个后缀模板
在当前表达式后输入一个点,并在完成列表中检查所需的模板。
如果您知道要应用的模板快捷方式,请开始输入——这将缩小建议列表。
根据当前上下文,某些后缀模板可能不会包含在完成列表中。 如果您没有看到所需的模板,但仍想使用它,请按 Control+Space 两次以在完成列表中查看所有模板。
一旦在建议列表中选择了所需的模板,请按 输入 。
如果模板具有 可编辑参数 (即需要用户输入),ReSharper 会在编辑器中启动一个 热区会话 ,并将输入位置设置在第一个参数处。 然后,您可以执行以下操作:
如果 ReSharper 为当前参数建议了一些值,使用 上 和 下 箭头键浏览建议值列表,或者直接输入所需的值。
按下 标签页 或 输入 以接受值并移动到下一个参数的输入位置。 如果这是最后一个参数,热区会话将完成,插入符号将移动到为会话定义的结束位置。
按下 Shift+Tab 以将输入焦点移动到上一个参数的输入位置。
按下 Esc 以退出热区会话。 在这种情况下,所有会话参数将使用默认值进行初始化。
配置后缀模板
后缀模板默认启用。 它们会出现在完成列表中,如果:
ReSharper IntelliSense is enabled on the 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 | 用调用包围表达式 |
|
.await | 等待 'Task' 类型的表达式 |
|
.cast | 用类型转换包围表达式 |
|
.else | 检查布尔表达式是否为“false” |
|
.field | 为表达式引入字段 |
|
.for | 使用索引遍历集合 |
|
.foreach | 遍历可枚举集合 |
|
.forr | 以反向索引遍历集合 |
|
.if | 检查布尔表达式是否为“true” |
|
.inject | 引入类型的主构造函数参数 |
|
.lock | 用锁块包围表达式 |
|
.new | 生成类型的实例化表达式 |
|
.not | 取反布尔表达式 |
|
.notnull | 检查表达式是否非 null |
|
.null | 检查表达式是否为 null |
|
.用括号包围当前表达式 | 用括号包围当前表达式 |
|
.parse | 将字符串解析为某种类型的值 |
|
.prop | 为表达式引入属性 |
|
.return | 从当前函数返回表达式 |
|
.sel | 在编辑器中选择表达式 |
|
.switch | 生成 switch 语句 |
|
.throw | 抛出 'Exception' 类型的表达式 |
|
.to | 将当前表达式赋值给某个变量 |
|
.tryparse | 将字符串解析为某种类型的值 |
|
.typeof | 用 typeof() 表达式包裹类型用法 |
|
.using | 用 using 语句包裹资源 |
|
.var | 为表达式引入变量 |
|
.while | 当布尔语句为 'true' 时进行迭代 |
|
.yield | 从迭代器方法中生成值 |
|
快捷方式 | 描述 | 示例 |
|---|---|---|
.beg..end | 从范围生成迭代器 |
|
.Cast | 用 UE 类型转换环绕表达式 |
|
.cbeg..cend | 从范围生成迭代器 |
|
.co_await | 将表达式作为参数传递给 co_await |
|
.co_return | 从当前协程返回表达式 |
|
.co_yield | 将表达式作为参数传递给 co_yield |
|
.const_cast | 用 const_cast 环绕表达式 |
|
.do | 迭代直到布尔表达式变为 'false' |
|
.dynamic_cast | 用 dynamic_cast 环绕表达式 |
|
.else | 检查布尔表达式是否为“false” |
|
.foreach | 遍历范围 |
|
.forward | 转发函数参数 |
|
.if | 检查布尔表达式是否为“true” |
|
.make_shared | 构造一个对象并将其包装在 std::shared_ptr 中 |
|
.make_unique | 构造一个对象并将其包装在 std::unique_ptr 中 |
|
.new | 生成类型的实例化表达式 |
|
.reinterpret_cast | 用 reinterpret_cast 环绕表达式 |
|
.return | 从当前函数返回表达式 |
|
.safe_cast | 用 safe_cast (C++/CLI) 环绕表达式 |
|
.static_cast | 用 static_cast 环绕表达式 |
|
.switch | 生成针对整型/枚举类型的 switch |
|
.var | 为表达式引入变量 |
|
.while | 在布尔表达式为 'true' 时迭代 |
|
快捷方式 | 描述 | 示例 |
|---|---|---|
.else | 检查布尔表达式是否为“false” |
|
.forof | 遍历可迭代对象 |
|
.if | 检查布尔表达式是否为“true” |
|
.notnull | 检查表达式是否非 null |
|
.notundefined | 检查表达式是否非 undefined |
|
.null | 检查表达式是否为 null |
|
.return | 从当前函数返回表达式 |
|
.undefined | 检查表达式是否为 undefined |
|
.var | 为表达式引入变量 |
|
快捷方式 | 描述 | 示例 |
|---|---|---|
.else | 检查布尔表达式是否为“false” |
|
.forof | 遍历可迭代对象 |
|
.if | 检查布尔表达式是否为“true” |
|
.instanceof | 检查表达式的实例 |
|
.notnull | 检查表达式是否非 null |
|
.notundefined | 检查表达式是否非 undefined |
|
.null | 检查表达式是否为 null |
|
.return | 从当前函数返回表达式 |
|
.typeof | 检查表达式的类型 |
|
.undefined | 检查表达式是否为 undefined |
|
.var | 为表达式引入变量 |
|
此功能在以下语言和技术中 受支持: