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
}