CA2215:Dispose 方法应调用基类释放
属性 | 值 |
---|---|
规则 ID | CA2215 |
标题 | Dispose 方法应调用基类释放 |
类别 | 使用情况 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 9 中默认启用 | 否 |
原因
实现 System.IDisposable 的类型继承自同时实现 IDisposable 的类型。 继承类型的 Dispose 方法不调用父类型的 Dispose 方法。
规则说明
如果某个类型继承自一个可释放类型,则该类型必须从其自身的 Dispose 方法内调用基类型的 Dispose 方法。 调用基类型 Dispose
方法可确保释放由基类型创建的所有资源。
如何解决冲突
若要解决此规则的冲突,请在 Dispose 方法中调用 base
.Dispose。
何时禁止显示警告
如果对 base
.Dispose 的调用发生在比规则检查更深的调用级别,则可禁止显示此规则发出的警告。
抑制警告
如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。
#pragma warning disable CA2215
// The code that's violating the rule is on this line.
#pragma warning restore CA2215
若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none
。
[*.{cs,vb}]
dotnet_diagnostic.CA2215.severity = none
有关详细信息,请参阅如何禁止显示代码分析警告。
示例
下面的示例展示了两个类型,一个是实现 IDisposable 的 TypeA
,还有一个是继承自类型 TypeA
并正确调用其 Dispose 方法的 TypeB
。
Namespace ca2215
Public Class TypeA
Implements IDisposable
Protected Overridable Overloads Sub Dispose(disposing As Boolean)
If disposing Then
' dispose managed resources
End If
' free native resources
End Sub
Public Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
' Disposable types implement a finalizer.
Protected Overrides Sub Finalize()
Dispose(False)
MyBase.Finalize()
End Sub
End Class
Public Class TypeB
Inherits TypeA
Protected Overrides Sub Dispose(disposing As Boolean)
If Not disposing Then
MyBase.Dispose(False)
End If
End Sub
End Class
End Namespace
using System;
namespace ca2215
{
public class TypeA : IDisposable
{
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Dispose managed resources
}
// Free native resources
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// Disposable types implement a finalizer.
~TypeA()
{
Dispose(false);
}
}
public class TypeB : TypeA
{
protected override void Dispose(bool disposing)
{
if (!disposing)
{
base.Dispose(false);
}
}
}
}