ReSharper 2021.3 最新变化

ReSharper 2021.3 支持最近发布的 Visual Studio 2022。 代码分析改进了 C#10 支持,包括文件范围命名空间和 global using 指令、可空引用类型和一般 C# 支持。 此版本还为用户定义的隐式转换 operators 添加了 Find Usages(查找用法)、新的装订区域标记和大幅增强的 Copy Code Reference(复制代码引用)功能。

下载

可免费试用 30 天

支持 Visual Studio 2022

ReSharper 现在支持新 Visual Studio 2022 的发布版本。 您将可以使用已在其他 Visual Studio 版本中熟悉的丰富功能集。 但 Visual Studio 2022 是 x64 进程,可分配的最大内存量不再受限。 因此,所有 ReSharper 功能的运行速度都会更快。

要将 ReSharper 与这个新版本的 Visual Studio 一起使用,请确保在 dotUltimate 2021.3 安装程序中选择 VS2022 图标。

C# 10

C# 10 最近发布,ReSharper 也在持续添加更多 C# 10 功能。 今天,我们正式添加对文件范围命名空间、global using、CallerArgumentExpression 特性、“插值字符串处理程序”概念和 C# 10 lambda 的支持。

首先是文件范围命名空间。 除了支持新语法,我们还添加了一个新的语法样式选项,允许您选择需要的样式(ReSharper | Options | Code Editing | C# | Syntax Style | Code body | Namespaces(ReSharper | 选项 | 代码编辑 | C# | 语法样式 | 代码正文 | 命名空间))。 选择样式时,ReSharper 将在检查中显示为遵循样式而必须更改的代码,并建议相应的快速修复。 您可以一键对项目甚至整个解决方案传播修正。

有两个上下文操作允许您将代码返回到以前的语法样式:Convert to file-scoped namespace(转换为文件范围命名空间)和 Convert to block-scoped namespace(转换为块范围命名空间)。

了解详情:文件范围命名空间

现在,我们来快速浏览一下 global using。 ReSharper 代码分析能够理解 global 关键字标记的 using,并使用它们正确解析项目中所有代码文件中的符号。 ReSharper 还会通知您 global using 是否被放置在文件中的错误位置。

ReSharper 会将在项目中没有使用的 global using 高亮显示为未使用,并提供移除语句的快速修复。

ReSharper 为 CallerArgumentExpression 特性带来了丰富的支持,包括代码补全和代码检查,帮助您正确使用。

了解详情:CallerArgumentExpression

C# 10 引入了“插值字符串处理程序”的新概念。 对于最终用户来说,这意味着字符串插值表达式在 .NET 6 中的运作速度整体提升,并且新的处理程序还可以让 Span<char> 值能够在插值孔中使用。 对于库作者,此功能允许其控制是否将字符串插值表达式转换为字符串。 ReSharper 2021.3 能够识别库代码中的“插值字符串处理程序”模式,可以在更多位置安全地建议使用字符串插值表达式。

ReSharper 会建议您将 record 结构标记为 readonly,以此帮助您从这些结构中获得最佳性能。 为避免不必要地使用修饰符混淆类型声明,仅当 record 类型具有非变异实例成员并且解决方案中没有通过 setter 的变异时才显示此检查(需要启用解决方案级分析)。

C# 10 允许您以点访问替换对象模式嵌套,从而略微简化模式匹配语法。

ReSharper 提供带有快速修复的相应检查,以及撤消快速修复的上下文操作。

最后但同样重要的更新:

  • 我们改进了对 C# 10 lambda 的支持:在 .NET 6 Minimal API 项目中预计不会出现红色代码或误报错误。 此外,ReSharper 还可以帮助您使用正确的语法并在编译器期望的位置添加圆括号。
  • ReSharper 现在支持使用“Program”作为具有顶级语句的代码的有效生成类名称。
  • 对接口中 static abstract 成员的初始支持现已可用。 代码分析认为这种结构有效,这意味着您不再需要处理红色代码。 Generate missing members(生成缺失成员)功能可发现和正确处理 static abstract 成员。 此版本还包括继承装订区域标记和导航到基础/派生符号的功能。

可空引用类型

人们时常会从其他资源(如 stackoverflow.com)复制代码片段。 如今,随着可空引用类型在 C# 中可用,一些代码示例已经包含 NRT 语法。 但是,如果您的解决方案中没有启用 NRT,该怎么办? ReSharper 新增了两项快速修复,可帮助您在将此类代码粘贴到项目后摆脱这种语法:Replace with JetBrains.Annotations attributes(替换为 JetBrains.Annotations 特性)和 Remove nullable annotations without ‘#nullable’ context(移除没有 ‘#nullable’ 上下文的可空注解)。

有时,类型实参与其可空性约束之间可能存在可空性不匹配。 现在有了针对此类情况的快速修复,包括:

  • 从类型实参中移除可空注解。
  • 从类型实参中移除 notnull 约束。
  • 在类型形参中允许可空值。
  • 禁止在用作类型实参的类型形参中使用可空值。

可以使用一个批量快速修复在文件、项目或整个解决方案中更正具有可空默认值的形参的注解。

还有一个新的批量快速修复,可在方法中的形参被确认为空时使形参可空。

代码分析

我们为带有闭包的 static 局部/匿名函数添加了几个新的快速修复和一个上下文操作:

  • Allow closures(允许闭包)快速修复可以从包含闭包的局部或匿名函数中移除 static 修饰符。
  • Pass closure as a parameter(将闭包作为形参传递)快速修复可以将静态局部函数中的闭包提升为形参。
  • Pass closure as a parameter(将闭包作为形参传递)上下文操作可以将非静态局部函数中的闭包提升为形参。

新的检查 Simplify string interpolation(简化字符串插值)带有相应的快速修复,可以将 .PadLeft().PadRight() 方法调用替换为插值字符串占位符内的对齐表达式 。

除了添加新的 C#10 record struct 之外,我们还改进了对常规结构的支持。 许多开发者仍然为 DTO 使用带有对象初始值设定项的类。 现在,您可以快速将所有用法转换为带形参的构造函数。 这可以通过 record 声明本身或任何对象初始值设定项完成。 请注意,定义具有属性分配的构造函数的 DTO 也可转换。

一段时间以来,ReSharper 已经能够就字段上的不一致锁定向您发出警告。 在这个版本中,我们添加了一个补充检查,它还能考虑到多个锁定资源的顺序,通知您可能的死锁周期。

ReSharper 现在会检查其他整数类型的积分算术表达式的合理性,包括 bytesbyteshortushortuintlongulongenum。 这有助于您避免不可到达的代码分支。

为了使复杂的长条件更易于阅读,我们为条件元素添加了高亮显示。 它可以高亮显示逻辑运算符组,例如 C# 中的 &&|| 链。

代码分析性能

为文件夹、项目或解决方案调用快速修复和上下文操作时,我们减少了实现快速修复和上下文操作所需的时间。

如果 Solution-Wide Error Analysis (SWEA)(解决方案级错误分析)与 Monitor warnings(监视警告)一同启用,ReSharper 将使用 SWEA 结果跳过没有相应问题的文件,大幅减少查找待修正问题所花费的时间。

我们也为没有在解决方案上运行 SWEA 的用户带来了好消息! ReSharper 现在将利用所有可用的 CPU 核心并行运行代码分析。 这在总体上减少了执行范围快速修复和上下文操作所需的时间。

 

对于包含大量方法的文件,我们显著提高了守护程序的性能,例如:

  • 具有大型或嵌套条件表达式、元组表达式或 switch 表达式的方法。
  • 禁用可空引用类型且具有大量类型检查的方法。
  • 启用可空引用类型且具有大量索引器访问的方法。
  • 启用可空引用类型且具有大量闭包的方法。

导航和 Find Usages(查找用法)

新的装订区域标记

我们添加了更多的装订区域标记,帮助您快速浏览类、接口或结构的继承结构。 新的 ↑O↑I 图标分别表示代码实体继承或实现了另一个类或接口。 如果代码实体的继承很复杂,选择图标后将显示一个菜单,其中列出了上方的所有上级,直至继承层次结构顶部。 如果一个类同时实现或继承了一个接口和一个类,ReSharper 会在装订区域中显示一个 ↑IO 图标。

此外,在此版本中,我们默认为类成员启用了装订区域标记。 如果类成员在派生类中被重写,ReSharper 将在类成员旁边的左侧装订区域中添加 ↓O 图标。 点击图标将:

  • 导航到派生类中重写此成员的成员。
  • 向您显示一个菜单,其中包含来自其他类的重写此成员的类成员列表。

用户定义的隐式转换 operators 的 Find Usages(查找用法)

现在,您可以为用户定义的隐式转换 operators 调用 Find Usages(查找用法)! 此功能的实现基于用于类型转换提示的机制。

这可以让您查明是否完全使用了用户定义的隐式转换 operators,然后导航到带有转换的代码块。

请注意,此算法并不快,计算和显示结果可能需要相当长的时间。

在调试模式下导航到接口实现

在调试模式下对接口类型的变量或形参调用 Go to Type of Symbol(转到符号类型)时,ReSharper 将转到当前帧中使用的确切实现,而非接口声明。

语言注入

您现在可以使用 [LanguageInjection] 注解特性标记函数的任何形参、字段或属性。 ReSharper 会将标记代码实体的字符串值视为指定语言的代码段。 可以注入以下语言:CSS、HTML、JavaScript、JSON 或 XML。 添加特性后,您将在字符串中获得正确的语法高亮显示、代码补全和其他功能。 您需要将最新版本的 JetBrains.Annotations 添加到项目中才能使用 LanguageInjection 特性。

Copy Code Reference(复制代码引用)

此版本对 Copy FQN(复制 FQN)功能做出了大量更改。 首先,该功能的名称改为 Copy Code Reference(复制代码引用)。 我们认为这个名称可以更好地反映该功能的作用。

我们为 Git 版本控制系统添加了新功能。 对于从 GitHub 克隆的项目,Copy Code Reference(复制代码引用)弹出窗口原生包含 GitHub 相关条目。 它们会生成指向 GitHub 仓库的链接以供快速共享。

对于非 GitHub 仓库,您现在可以在 ReSharper 设置中添加自定义 URI 模板。 所有模板都将出现在 Copy Code Reference(复制代码引用)弹出窗口中。 URI 模板可以由各种预定义的占位符组成,例如 Current Branch Name(当前分支名称)、File Name(文件名)、Current Line Number(当前行号)等。

最后,弹出窗口本身也得到了重大改造。 它的设计、图标和格式设置均已更新。

格式设置

  • 我们添加了用于在语句条件内缩进 lambda 或属性模式大括号的选项,例如在 if()while() 内。
  • 我们添加了用于在 if()foreach() 等的圆括号内对齐语句条件的选项,该选项默认开启。
  • 我们添加了用于包装、切割、对齐和减少二进制模式缩进的选项,例如,x is Foo or Bar or Baz

创建新的 Unreal Engine 类

使用 ReSharper C++ 2021.3 时,您不再需要为了创建新类而切换到 Unreal Editor,因为 Unreal Engine 类的所有预定义模板现在都已添加到 ReSharper 文件模板列表中。

要创建新类,只需转到 Solution Explorer(解决方案资源管理器),右键点击所需项目文件夹,打开 Add(添加)菜单(或使用 Ctrl+Alt+Insert)。 从列表中选择 Unreal Engine 模板并为新类命名后,ReSharper C++ 将根据私有或公共上下文在适当的文件夹中生成带有模板代码的头文件和源文件。

ReSharper C++ 2021.3 最新变化

更好的 C++20 支持

您可以使用 C++20 指定初始值设定项为聚合初始化快速生成样板代码。 只需从补全列表中选择相应条目为数据成员插入指示符,然后提供初始值。

此外,ReSharper C++ 2021.3 还带来了新的检查,可以帮助您采用新的库函数从标准容器中擦除元素、检查关联容器中是否存在元素以及创建具有默认初始化的智能指针。

ReSharper C++ 2021.3 最新变化

对 AnalyzerConfig 文件的支持

从 .NET 5 SDK 开始,您可以使用全局 AnalyzerConfig 文件配置 Visual Studio 的分析器选项。 ReSharper 2021.3 可以从这些全局 AnalyzerConfig 文件中读取代码样式信息,并相应地调整 ReSharper 规则。

采样内存分配数据 dotUltimate

dotMemory 现在可以根据 ETW 事件获取有关内存分配的采样数据。 与收集分配数据的传统(统计)方式相比,采样的准确性较低,但具有许多优点:

  • 采样的分配数据在无性能损失的情况下收集。
  • 您不需要明确启用此数据收集,它将始终处于有效状态。
  • 当您将分析器附加到已在运行的应用程序时,也可以收集采样分配数据。

注意,此功能仅在 Windows 上可用。

dotMemory 2021.3 最新变化

下载

可免费试用 30 天