CA2202: No aplicar Dispose a los objetos varias vecesCA2202: Do not dispose objects multiple times

TypeNameTypeName DoNotDisposeObjectsMultipleTimesDoNotDisposeObjectsMultipleTimes
Identificador de comprobaciónCheckId CA2202CA2202
CategoríaCategory Microsoft.UsageMicrosoft.Usage
Cambio problemáticoBreaking Change No trascendentalNon Breaking

MotivoCause

Implementación de un método contiene rutas de acceso del código que podrían provocar varias llamadas a System.IDisposable.Dispose o un equivalente de Dispose, como un método Close() en algunos tipos, en el mismo objeto.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.

Descripción de la reglaRule description

Una correcta ejecución Dispose método puede llamarse varias veces sin producir una excepción.A correctly implemented Dispose method can be called multiple times without throwing an exception. Sin embargo, esto no está garantizado y para evitar que se generen un System.ObjectDisposedException no debe llamar a Dispose más de una vez en un objeto.However, this is not guaranteed and to avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.

Cómo corregir infraccionesHow to fix violations

Para corregir una infracción de esta regla, cambie la implementación hasta que independientemente de la ruta de acceso del código, Dispose se llama solo una vez para el objeto.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.

Cuándo Suprimir advertenciasWhen to suppress warnings

No suprima las advertencias de esta regla.Do not suppress a warning from this rule. Incluso si Dispose para el objeto se sabe que se puede llamar varias veces, la implementación podría cambiar en el futuro.Even if Dispose for the object is known to be safely callable multiple times, the implementation might change in the future.

EjemploExample

Anidar using instrucciones (Using en Visual Basic) pueden producir infracciones de la advertencia CA2202.Nested using statements (Using in Visual Basic) can cause violations of the CA2202 warning. Si el recurso IDisposable de anidada interna using instrucción contiene el recurso de la exterior using instrucción, el Dispose método del recurso anidado libera el recurso contenido.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. Cuando se produce esta situación, el Dispose método externo using instrucción intenta disponer de su recurso por segunda vez.When this situation occurs, the Dispose method of the outer using statement attempts to dispose its resource for a second time.

En el ejemplo siguiente, un Stream objeto que se crea en un exterior usando la instrucción se libera al final de la instrucción using interna en el método Dispose de la StreamWriter objeto que contiene el stream objeto.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. Al final de la exterior using instrucción, el stream objeto se libere una segunda vez.At the end of the outer using statement, the stream object is released a second time. La segunda versión es una infracción 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...
    }
}

EjemploExample

Para resolver este problema, use un try / finally bloquear en lugar de la exterior using instrucción.To resolve this issue, use a try/finally block instead of the outer using statement. En el finally bloquear, asegúrese de que el stream del recurso no es 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();
}

Vea tambiénSee also