CA2215:Dispose 方法应调用基类释放

属性
规则 ID CA2215
标题 Dispose 方法应调用基类释放
类别 使用情况
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

实现 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

有关详细信息,请参阅如何禁止显示代码分析警告

示例

下面的示例展示了两个类型,一个是实现 IDisposableTypeA,还有一个是继承自类型 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);
            }
        }
    }
}

另请参阅