CA1821 : Supprimer les finaliseurs videsCA1821: Remove empty finalizers

TypeNameTypeName RemoveEmptyFinalizersRemoveEmptyFinalizers
CheckIdCheckId CA1821CA1821
CategoryCategory Microsoft.PerformanceMicrosoft.Performance
Modification avec ruptureBreaking Change Sans ruptureNon-breaking

CauseCause

Un type implémente un finaliseur qui est vide, appelle uniquement le finaliseur du type de base ou appelle uniquement émises sous certaines conditions de méthodes.A type implements a finalizer that is empty, calls only the base type finalizer, or calls only conditionally emitted methods.

Description de la règleRule Description

Évitez autant que possible d'utiliser des finaliseurs en raison de la surcharge supplémentaire des performances impliquée dans le suivi de la durée de vie de l'objet.Whenever you can, avoid finalizers because of the additional performance overhead that is involved in tracking object lifetime. Le garbage collector exécutera le finaliseur avant de collecter l’objet.The garbage collector will run the finalizer before it collects the object. Cela signifie que les deux collections sont requises pour collecter l’objet.This means that two collections will be required to collect the object. Un finaliseur vide entraîne cette charge mémoire supplémentaire sans aucun avantage.An empty finalizer incurs this added overhead without any benefit.

Comment corriger les violationsHow to Fix Violations

Supprimez le finaliseur vide.Remove the empty finalizer. Si un finaliseur est requis pour le débogage, insérez-le entièrement dans #if DEBUG / #endif directives.If a finalizer is required for debugging, enclose the whole finalizer in #if DEBUG / #endif directives.

Quand supprimer les avertissementsWhen to Suppress Warnings

Ne supprimez pas un message de cette règle.Do not suppress a message from this rule. Échec de supprimer la finalisation diminue les performances et n’apporte aucun avantage.Failure to suppress finalization decreases performance and provides no benefits.

ExempleExample

L’exemple suivant montre un finaliseur vide qui doit être supprimé, un finaliseur qui doit être placé dans #if DEBUG / #endif directives et un finaliseur qui utilise le #if DEBUG / #endif directives correctement.The following example shows an empty finalizer that should be removed, a finalizer that should be enclosed in #if DEBUG / #endif directives, and a finalizer that uses the #if DEBUG / #endif directives correctly.

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
}