次の方法で共有


CA1821: 空のファイナライザーを削除します

TypeName

RemoveEmptyFinalizers

CheckId

CA1821

分類

Microsoft.Performance

互換性に影響する変更点

なし

原因

型が空のファイナライザーを実装しているか、基本型ファイナライザーのみを呼び出しているか、条件付きで出力されたメソッドのみを呼び出しています。

規則の説明

オブジェクトの有効期間の追跡に関連するパフォーマンス オーバーヘッドが増大するため、ファイナライザーは可能な限り使用しないでください。ガベージ コレクターはファイナライザーを実行してからオブジェクトを収集します。そのため、オブジェクトの収集には 2 つのコレクションが必要となります。空のファイナライザーを使用すると、オーバーヘッドが増大するだけで何の利点もありません。

違反の修正方法

空のファイナライザーを削除します。デバッグのためにファイナライザーが必要な場合は、ファイナライザー全体を #if DEBUG / #endif ディレクティブで囲んでください。

警告を抑制する状況

この規則によるメッセージは抑制しないでください。終了処理を省略した場合のエラーによってパフォーマンスが低下します。また何も利点がありません。

使用例

次の例は、削除する必要のある空のファイナライザー、#if DEBUG / #endif ディレクティブで囲む必要のあるファイナライザー、および #if DEBUG / #endif ディレクティブを正しく使用しているファイナライザーを示しています。

using System.Diagnostics;

public class Class1
{
    // Violation occurs because the finalizer is empty.
    ~Class1()
    {
    }
}

public class Class2
{
    // Violation occurs because Debug.Fail is a conditional method. 
    // The finalizer will contain code only if the DEBUG directive 
    // symbol is present at compile time. When the DEBUG 
    // directive is not present, the finalizer will still exist, but 
    // it will be empty.
    ~Class2()
    {
        Debug.Fail("Finalizer called!");
    }
}

public class Class3
{
    #if DEBUG
        // Violation will not occur because the finalizer will exist and 
        // contain code when the DEBUG directive is present. When the 
        // DEBUG directive is not present, the finalizer will not exist, 
        // and therefore not be empty.
        ~Class3()
        {
            Debug.Fail("Finalizer called!");
        }
    #endif
}