CA2202 : Ne pas supprimer des objets plusieurs foisCA2202: Do not dispose objects multiple times

TypeNameTypeName DoNotDisposeObjectsMultipleTimesDoNotDisposeObjectsMultipleTimes
CheckIdCheckId CA2202CA2202
CategoryCategory Microsoft.UsageMicrosoft.Usage
Modification avec ruptureBreaking Change Sans ruptureNon Breaking

CauseCause

Une implémentation de méthode contient des chemins d’accès de code qui peuvent provoquer des appels multiples à System.IDisposable.Dispose ou un Dispose équivalent, tel qu’une méthode Close() sur certains types sur le même objet.A method implementation contains code paths that could cause multiple calls to System.IDisposable.Dispose or a Dispose equivalent, such as a Close() method on some types, on the same object.

Description de la règleRule Description

A implémenté correctement Dispose méthode peut être appelée plusieurs fois sans lever d’exception.A correctly implemented Dispose method can be called multiple times without throwing an exception. Toutefois, cela n’est pas garanti et pour éviter de générer un System.ObjectDisposedException vous ne devez pas appeler Dispose plusieurs fois sur un objet.However, this is not guaranteed and to avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.

CA2000 : Supprimez les objets avant de perdre l’étendueCA2000: Dispose objects before losing scope

Comment corriger les violationsHow to Fix Violations

Pour corriger une violation de cette règle, modifiez l’implémentation donc autrement indépendamment du chemin de code Dispose est appelée qu’une seule fois pour l’objet.To fix a violation of this rule, change the implementation so that regardless of the code path, Dispose is called only one time for the object.

Quand supprimer les avertissementsWhen to Suppress Warnings

Ne supprimez aucun avertissement de cette règle.Do not suppress a warning from this rule. Même si Dispose pour l’objet est connu pour être en toute sécurité peut être appelée plusieurs fois, l’implémentation peut changer à l’avenir.Even if Dispose for the object is known to be safely callable multiple times, the implementation might change in the future.

ExempleExample

Imbriqué using instructions (Using en Visual Basic) peuvent provoquer des violations de l’avertissement CA2202.Nested using statements (Using in Visual Basic) can cause violations of the CA2202 warning. Si la ressource IDisposable d’interne imbriquée using instruction contient la ressource d’externe using instruction, le Dispose méthode de la ressource imbriquée libère la ressource contenue.If the IDisposable resource of the nested inner using statement contains the resource of the outer using statement, the Dispose method of the nested resource releases the contained resource. Lorsque cette situation se produit, le Dispose méthode externe using instruction essaie de supprimer sa ressource pour la deuxième fois.When this situation occurs, the Dispose method of the outer using statement attempts to dispose its resource for a second time.

Dans l’exemple suivant, un Stream objet qui est créé en externe à l’aide d’instruction est libérée à la fin de l’instruction using interne dans la méthode Dispose de la StreamWriter objet qui contient le stream objet.In the following example, a Stream object that is created in an outer using statement is released at the end of the inner using statement in the Dispose method of the StreamWriter object that contains the stream object. À la fin de l’élément externe using instruction, le stream objet est libéré une deuxième fois.At the end of the outer using statement, the stream object is released a second time. La deuxième version est une violation de CA2202.The second release is a violation of CA2202.

using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
{
    using (StreamWriter writer = new StreamWriter(stream))
    {
        // Use the writer object...
    }
}

ExempleExample

Pour résoudre ce problème, utilisez un try / finally bloc au lieu d’externe using instruction.To resolve this issue, use a try/finally block instead of the outer using statement. Dans le finally bloquer, assurez-vous que le stream ressource n’est pas null.In the finally block, make sure that the stream resource is not null.

Stream stream = null;
try
{
    stream = new FileStream("file.txt", FileMode.OpenOrCreate);
    using (StreamWriter writer = new StreamWriter(stream))
    {
        stream = null;
        // Use the writer object...
    }
}
finally
{
    if(stream != null)
        stream.Dispose();
}

Voir aussiSee Also

System.IDisposable Modèle de suppressionSystem.IDisposable Dispose Pattern