当前位置: 首页 > news >正文

利用 ReSharper 自定义代码中的错误模式,在代码审查之前就发现并修改错误

多人协作开发的项目总会遇到代码编写风格上的差异。一般工具都能帮我们将常见的差异统一起来——例如 if 的换行;但也有一些不那么通用,但项目中却经常会出现的写法也需要统一。

例如将单元测试中的 Assert.AreEqual(foo.GetType(), typeof(Foo)); 换成 Assert.IsInstanceOfType(foo, typeof(Foo));

阅读本文将学习如何使用 ReSharper 的 Custom Pattern 功能来完成这样的警告和转换。


预览效果

我们团队中自定义了一个代码风格规范,在单元测试中 Assert.AreEqual(foo.GetType(), typeof(Foo)); 应该被换成 Assert.IsInstanceOfType(foo, typeof(Foo));。于是,ReSharper 会给出警告,并给出推荐的写法;如果遵循 ReSharper 的建议,ReSharper 将自动为我们修改代码。

给出警告,并提供建议
▲ 给出警告,并提供建议

可以遵循建议
▲ 可以遵循建议

然后代码就被修改成我们建议的写法了
▲ 然后代码就被修改成我们建议的写法了

开始编写自定义模式

我们需要打开 ReSharper 的选项窗口,然后在里面找到“自定义模式”:

Options

Custom Patterns

点击“Add Pattern”之后,我们就可以开始编写 Custom Pattern 了。

Add Highlighting Pattern

为了快速开始,可以将下面的两行代码分别复制到两个黑框中。(如果你只看到了一个黑框,请在右上角将“Find”按钮切换到“Replace”按钮。)

// 将下面这一句话复制到第一个黑色框中。
Assert.AreEqual($instance$.GetType(), typeof($type$));
// 将下面这一句话复制到第二个黑色框中。
Assert.IsInstanceOfType($instance$, typeof($type$));

这时,占位符框中就会出现我们编写的两个占位符:

占位符列表
▲ 占位符列表

我们需要将 instance 占位符从表达式修改为标识符:

标识符

解释一下这几项的意思:
1. Argument Placeholder 参数占位符
- 意味着这里是参数列表,可以是一个或多个参数,中间用逗号分隔。参数数量可以额外指定。
1. Expression Placeholder 表达式占位符
- 形如 foo.Bar(),注意,分号并不是表达式的一部分。
1. Identifier Placeholder 标识符占位符
1. Statement Placeholder 语句占位符
- 形如 if (foo is null) throw new ArgumentNullException(nameof(foo));,注意,分号属于语句的一部分。
1. Type Placeholder 类型占位符
- 形如 Foo,或者 Walterlv.Demo.Foo

确定之后我们填写其他的信息:

  • Pattern severity:警告
    • 如果你需要,修改成“错误”也是可以的;事实上我们的项目中就是标记为错误,这样找出的代码就会是红色的错误下划线了。
  • Suppression key:AssertEqualToInstanceOfType
    • (可选)只有指定了用于阻止检查的标识字符串,才可以在特殊情况下用以下几种方法阻止检查;否则你将对错误无能为力。
      • // ReSharper disable once AssertEqualToInstanceOfType
      • [SuppressMessage("ReSharper", "AssertEqualToInstanceOfType")]
  • 上面的 Description:建议简化成 InstanceOfType 以提升可读性。
    • 这将在鼠标滑到找到的语句上面时给出提示。
      提示
  • 下面的 Description:简化成 InstanceOfType
    • 这将在在 Alt+Enter 时出现的重构列表中显示
      可以遵循建议

设置完之后,“Edit Highlighting Pattern”窗口应该是这样的:

设置完的 Edit Highlighting Pattern 窗口

当然,在“Custom Pattern”列表中也可以统一设置所有模式的警告级别。

Warning

最后,把这些规则保存到团队共享中,那么所有安装了 ReSharper 的此项目的团队成员都将遵循这一套规则

保存到团队

自己动手,发掘潜能

Custom Pattern 功能只是为了给我们一个格式转换吗?才不止是这样哦!它能够帮助我们发现一些潜在的错误。

例如使用 MSTestEnhancer 进行单元测试时,如果使用了它推荐的单元测试风格,就应该配套使用 ContractTestCase 特性,如果不这么写,必定意味着错误。

于是,我们可以编写一个自定义模式来发现和修改这样的错误。

更复杂的例子

你认为可以怎么写呢?我在下面给出了我的写法。你还可以发掘出更多的潜能吗?非常期待!

配置 MSTestEnhancer 的检查

相关文章:

  • 在编写异步方法时,使用 ConfigureAwait(false) 避免使用者死锁
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • 解决 mklink 使用中的各种坑(硬链接,软链接/符号链接,目录链接)
  • Roslyn 的确定性构建
  • 使用 MSBuild 响应文件 (rsp) 来指定 dotnet build 命令行编译时的大量参数
  • VS 编译太慢了吗?新建解决方案配置关闭一部分项目的编译
  • 流畅设计 Fluent Design System 中的光照效果 RevealBrush,WPF 也能模拟实现啦!
  • 语义版本号(Semantic Versioning)
  • 使用 GitVersion 在编译或持续构建时自动使用语义版本号(Semantic Versioning)
  • UWP 流畅设计中的光照效果(容易的 RevealBorderBrush 和不那么容易的 RevealBackgroundBrush)
  • 使用 Emit 生成 IL 代码
  • 如何快速编写和调试 Emit 生成 IL 的代码
  • 自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference
  • 冷算法:自动生成代码标识符(类名、方法名、变量名)
  • WPF/UWP 的 Grid 布局竟然有 Bug,还不止一个!了解 Grid 中那些未定义的布局规则
  • 11111111
  • codis proxy处理流程
  • django开发-定时任务的使用
  • LeetCode算法系列_0891_子序列宽度之和
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • supervisor 永不挂掉的进程 安装以及使用
  • Swift 中的尾递归和蹦床
  • ucore操作系统实验笔记 - 重新理解中断
  • 给Prometheus造假数据的方法
  • 讲清楚之javascript作用域
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 每天一个设计模式之命令模式
  • 那些被忽略的 JavaScript 数组方法细节
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 自制字幕遮挡器
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • ###C语言程序设计-----C语言学习(3)#
  • #控制台大学课堂点名问题_课堂随机点名
  • (LeetCode C++)盛最多水的容器
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (阿里云万网)-域名注册购买实名流程
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (三)c52学习之旅-点亮LED灯
  • (五)关系数据库标准语言SQL
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • /run/containerd/containerd.sock connect: connection refused
  • ::
  • :中兴通讯为何成功
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [ANT] 项目中应用ANT
  • [CDOJ 1343] 卿学姐失恋了