JetBrains Rider 2025.2 Help

处置分析

为了减少代码中的资源泄漏并提高其性能,您需要确保正确处理可释放资源。 一方面,您希望在特定 API 的调用点强制使用 示意图 关键字,但另一方面,您又不希望每次使用 IDisposable 时都出现大量误报。

因此,为了分析可释放资源的处理,JetBrains Rider 依赖于来自 JetBrains.Annotations 的一组注解属性。

要开始分析,请使用 [MustDisposeResource] 属性注解您的关键可释放 API。 您可以使用此属性注解可释放类型、它们的构造函数和工厂方法。 完成此操作后,JetBrains Rider 将报告未将资源视为可释放的调用点,并建议相应的快速修复:

JetBrains Rider:释放分析。 强制使用 'using' 指令

当您将可释放资源包装在 示意图 中或显式调用该资源上的 Dispose() 时,警告将消失。

如上方屏幕截图所示, [必须释放资源] 的用法也会通过相应的 内联提示 标记,您可以在 编辑器 | 内联提示 | C# | 其他 页的 JetBrains Rider 设置 Ctrl+Alt+S 中进行配置。

如果您的 API 未公开 Dispose() 方法或有多个处理释放的相关方法,您可以使用 [HandlesResourceDisposal] 属性注解那些实际释放资源的方法:

[MustDisposeResource] public class HasNativeResources { // acquire disposable resources [HandlesResourceDisposal] public void Close() {/* process disposal */} } public class Test { public Test() { var resource = new HasNativeResources(); // no warning, because `Close()` handles the disposal resource.Close(); } }

如果自定义释放方法需要一个可释放资源作为参数,您可以使用 [处理资源释放] 注解相应的参数:

[MustDisposeResource] public class HasNativeResources : IDisposable { // some work with native resources public void Dispose() {/* process disposal */} } public static class ResourceHelpers { public static void Close([HandlesResourceDisposal] HasNativeResources res) { // handle disposal } } public class Test { public Test() { // no warning, because `Close()` handles the disposal var resource = new HasNativeResources(); ResourceHelpers.Close(resource); } }

最后,如果从注解的来源获取资源的方法未处理资源释放,但将其返回给其他调用者,则潜在的资源处理不当问题将传递给调用者。 如果这是有意为之,您可以通过使用 [必须释放资源] 注解该方法来告知分析器,将处理可释放资源的责任显式委托给调用者:

[MustDisposeResource] public class HasNativeResources : IDisposable { // some work with native resources public void Dispose() {/* process disposal */} } public class Sample { [MustDisposeResource] public HasNativeResources ProcessWithoutDisposing() { var resource = new HasNativeResources(); Console.WriteLine($"Logging resource: {resource}"); // no warning because the method is marked with [MustDisposeResource] return resource; } }

乐观和悲观分析模式

当您通过 [MustDisposeResource] API 接收一个对象时,JetBrains Rider 将始终认为它已被释放,并且如果您将相应的变量包装在 示意图 中或显式调用该变量上的 Dispose() ,将不会发出任何警告。

如果您将可释放变量作为参数传递给方法,JetBrains Rider 将根据分析模式发出警告:

  • Optimistic (默认):所有接受 IDisposable 或派生类型的方法都被认为是安全的;也就是说,我们假设它们会在处理对象后调用 Dispose()

  • Pessimistic :只有当接受 IDisposable 的参数被标记为 [HandlesResourceDisposal] 属性时,方法才被认为是安全的。 否则,JetBrains Rider 将报告一个未释放的变量。

您可以在 JetBrains Rider 设置 的 编辑器 | 检查设置 页面上更改分析模式 Ctrl+Alt+S

释放分析的代码检查

释放分析依赖于以下 代码检查

请确保这些检查已在 JetBrains Rider 设置 的 编辑器 | 检查设置 | 检查严重性 页面上启用 Ctrl+Alt+S

为了微调分析,您可以 更改特定检查的严重级别 或在应忽略的地方 抑制 某些检查。

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