CA2215:Dispose メソッドが基底クラスの Dispose を呼び出す必要があります

プロパティ
ルール ID CA2215
Title Dispose メソッドが基底クラスの Dispose を呼び出す必要があります
[カテゴリ] 使用方法
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 いいえ

原因

System.IDisposable を実装する型は、IDisposable も実装する型から継承します。 継承する型の Dispose メソッドで、親の型の Dispose メソッドを呼び出すことはありません。

規則の説明

破棄可能な型から継承している型では、それ自体の Dispose メソッド内から基本データ型の Dispose メソッドを呼び出す必要があります。 基本データ型の Dispose メソッドを呼び出すことにより、基本データ型によって作成されたすべてのリソースが確実に解放されます。

違反の修正方法

この規則の違反を修正するには、Disposebase.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 の、2 つの型が示されています。

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);
            }
        }
    }
}

こちらもご覧ください