CA2215:Dispose メソッドが基底クラスの Dispose を呼び出す必要があります
プロパティ | 値 |
---|---|
ルール ID | CA2215 |
Title | Dispose メソッドが基底クラスの 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
詳細については、「コード分析の警告を抑制する方法」を参照してください。
例
次の例では、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);
}
}
}
}
こちらもご覧ください
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET