CA2015: MemoryManager から派生した型にはファイナライザーを定義しません<T>

プロパティ
ルール ID CA2015
Title MemoryManager<T> から派生した型にはファイナライザーを定義しません
[カテゴリ] 信頼性
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 警告として

原因

MemoryManager<T> から派生した型のファイナライザーの定義

規則の説明

MemoryManager<T> から派生した型にファイナライザーを追加すると、バグの発生を示すメッセージが表示されることがあります。これは、Span<T> によってまだ使用されている可能性があるのに、Span<T> で渡されたネイティブ リソースがクリーンアップされていることを示します。

注意

MemoryManager<T> クラスは高度なシナリオ向けです。 ほとんどの開発者は、これを使用する必要はありません。

違反の修正方法

違反を修正するには、ファイナライザーの定義を削除します。

class DerivedClass <T> : MemoryManager<T>
{
    public override bool Dispose(bool disposing)
    {
        if (disposing)
        {
            _handle.Dispose();
        }
    }

    ...

    // Violation occurs, remove the finalizer to fix the warning.
    ~DerivedClass() => Dispose(false);
}

どのようなときに警告を抑制するか

デバッグまたは検証のためにファイナライザーを作成するのであれば、この規則違反を抑制しても安全です。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable CA2015
// The code that's violating the rule is on this line.
#pragma warning restore CA2015

ファイル、フォルダー、またはプロジェクトのルールを無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.CA2015.severity = none

規則のこのカテゴリ全体を無効にするには、構成ファイルでカテゴリの重要度を none に設定します。

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none

詳細については、「コード分析の警告を抑制する方法」を参照してください。

関連項目