ReSharper 2021.3 支持最近发布的 Visual Studio 2022。 代码分析改进了 C#10 支持,包括文件范围命名空间和 global using 指令、可空引用类型和一般 C# 支持。 此版本还为用户定义的隐式转换 operators 添加了 Find Usages(查找用法)、新的装订区域标记和大幅增强的 Copy Code Reference(复制代码引用)功能。
可免费试用 30 天
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 特性带来了丰富的支持,包括代码补全和代码检查,帮助您正确使用。
C# 10 引入了“插值字符串处理程序”的新概念。 对于最终用户来说,这意味着字符串插值表达式在 .NET 6 中的运作速度整体提升,并且新的处理程序还可以让 Span<char> 值能够在插值孔中使用。 对于库作者,此功能允许其控制是否将字符串插值表达式转换为字符串。 ReSharper 2021.3 能够识别库代码中的“插值字符串处理程序”模式,可以在更多位置安全地建议使用字符串插值表达式。
ReSharper 会建议您将 record 结构标记为 readonly,以此帮助您从这些结构中获得最佳性能。 为避免不必要地使用修饰符混淆类型声明,仅当 record 类型具有非变异实例成员并且解决方案中没有通过 setter 的变异时才显示此检查(需要启用解决方案级分析)。
C# 10 允许您以点访问替换对象模式嵌套,从而略微简化模式匹配语法。
ReSharper 提供带有快速修复的相应检查,以及撤消快速修复的上下文操作。
最后但同样重要的更新:
人们时常会从其他资源(如 stackoverflow.com)复制代码片段。 如今,随着可空引用类型在 C# 中可用,一些代码示例已经包含 NRT 语法。 但是,如果您的解决方案中没有启用 NRT,该怎么办? ReSharper 新增了两项快速修复,可帮助您在将此类代码粘贴到项目后摆脱这种语法:Replace with JetBrains.Annotations attributes(替换为 JetBrains.Annotations 特性)和 Remove nullable annotations without ‘#nullable’ context(移除没有 ‘#nullable’ 上下文的可空注解)。
有时,类型实参与其可空性约束之间可能存在可空性不匹配。 现在有了针对此类情况的快速修复,包括:
可以使用一个批量快速修复在文件、项目或整个解决方案中更正具有可空默认值的形参的注解。
还有一个新的批量快速修复,可在方法中的形参被确认为空时使形参可空。
我们为带有闭包的 static 局部/匿名函数添加了几个新的快速修复和一个上下文操作:
新的检查 Simplify string interpolation(简化字符串插值)带有相应的快速修复,可以将 .PadLeft()
和 .PadRight()
方法调用替换为插值字符串占位符内的对齐表达式 。
除了添加新的 C#10 record struct
之外,我们还改进了对常规结构的支持。 许多开发者仍然为 DTO 使用带有对象初始值设定项的类。 现在,您可以快速将所有用法转换为带形参的构造函数。 这可以通过 record
声明本身或任何对象初始值设定项完成。 请注意,定义具有属性分配的构造函数的 DTO 也可转换。
一段时间以来,ReSharper 已经能够就字段上的不一致锁定向您发出警告。 在这个版本中,我们添加了一个补充检查,它还能考虑到多个锁定资源的顺序,通知您可能的死锁周期。
ReSharper 现在会检查其他整数类型的积分算术表达式的合理性,包括 byte
、sbyte
、short
、ushort
、uint
、long
、ulong
和 enum
。 这有助于您避免不可到达的代码分支。
为了使复杂的长条件更易于阅读,我们为条件元素添加了高亮显示。 它可以高亮显示逻辑运算符组,例如 C# 中的 &&
和 ||
链。
为文件夹、项目或解决方案调用快速修复和上下文操作时,我们减少了实现快速修复和上下文操作所需的时间。
如果 Solution-Wide Error Analysis (SWEA)(解决方案级错误分析)与 Monitor warnings(监视警告)一同启用,ReSharper 将使用 SWEA 结果跳过没有相应问题的文件,大幅减少查找待修正问题所花费的时间。
我们也为没有在解决方案上运行 SWEA 的用户带来了好消息! ReSharper 现在将利用所有可用的 CPU 核心并行运行代码分析。 这在总体上减少了执行范围快速修复和上下文操作所需的时间。
对于包含大量方法的文件,我们显著提高了守护程序的性能,例如:
switch
表达式的方法。 我们添加了更多的装订区域标记,帮助您快速浏览类、接口或结构的继承结构。 新的 ↑O
和 ↑I
图标分别表示代码实体继承或实现了另一个类或接口。 如果代码实体的继承很复杂,选择图标后将显示一个菜单,其中列出了上方的所有上级,直至继承层次结构顶部。 如果一个类同时实现或继承了一个接口和一个类,ReSharper 会在装订区域中显示一个 ↑IO
图标。
此外,在此版本中,我们默认为类成员启用了装订区域标记。 如果类成员在派生类中被重写,ReSharper 将在类成员旁边的左侧装订区域中添加 ↓O
图标。 点击图标将:
现在,您可以为用户定义的隐式转换 operators 调用 Find Usages(查找用法)! 此功能的实现基于用于类型转换提示的机制。
这可以让您查明是否完全使用了用户定义的隐式转换 operators,然后导航到带有转换的代码块。
请注意,此算法并不快,计算和显示结果可能需要相当长的时间。
在调试模式下对接口类型的变量或形参调用 Go to Type of Symbol(转到符号类型)时,ReSharper 将转到当前帧中使用的确切实现,而非接口声明。
您现在可以使用 [LanguageInjection] 注解特性标记函数的任何形参、字段或属性。 ReSharper 会将标记代码实体的字符串值视为指定语言的代码段。 可以注入以下语言:CSS、HTML、JavaScript、JSON 或 XML。 添加特性后,您将在字符串中获得正确的语法高亮显示、代码补全和其他功能。 您需要将最新版本的 JetBrains.Annotations 添加到项目中才能使用 LanguageInjection 特性。
此版本对 Copy FQN(复制 FQN)功能做出了大量更改。 首先,该功能的名称改为 Copy Code Reference(复制代码引用)。 我们认为这个名称可以更好地反映该功能的作用。
我们为 Git 版本控制系统添加了新功能。 对于从 GitHub 克隆的项目,Copy Code Reference(复制代码引用)弹出窗口原生包含 GitHub 相关条目。 它们会生成指向 GitHub 仓库的链接以供快速共享。
使用 ReSharper C++ 2021.3 时,您不再需要为了创建新类而切换到 Unreal Editor,因为 Unreal Engine 类的所有预定义模板现在都已添加到 ReSharper 文件模板列表中。
要创建新类,只需转到 Solution Explorer(解决方案资源管理器),右键点击所需项目文件夹,打开 Add(添加)菜单(或使用 Ctrl+Alt+Insert)。 从列表中选择 Unreal Engine 模板并为新类命名后,ReSharper C++ 将根据私有或公共上下文在适当的文件夹中生成带有模板代码的头文件和源文件。
您可以使用 C++20 指定初始值设定项为聚合初始化快速生成样板代码。 只需从补全列表中选择相应条目为数据成员插入指示符,然后提供初始值。
此外,ReSharper C++ 2021.3 还带来了新的检查,可以帮助您采用新的库函数从标准容器中擦除元素、检查关联容器中是否存在元素以及创建具有默认初始化的智能指针。
从 .NET 5 SDK 开始,您可以使用全局 AnalyzerConfig 文件配置 Visual Studio 的分析器选项。 ReSharper 2021.3 可以从这些全局 AnalyzerConfig 文件中读取代码样式信息,并相应地调整 ReSharper 规则。
dotMemory 现在可以根据 ETW 事件获取有关内存分配的采样数据。 与收集分配数据的传统(统计)方式相比,采样的准确性较低,但具有许多优点:
注意,此功能仅在 Windows 上可用。
可免费试用 30 天