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 de código que podrían provocar varias llamadas a System.IDisposable.Dispose o a 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

A que se haya implementado correctamente 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 se garantiza y para evitar que se generen un System.ObjectDisposedException no debería 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.

CA2000: Desechar (Dispose) objetos antes de perder el ámbitoCA2000: Dispose objects before losing scope

Cómo corregir infraccionesHow to Fix Violations

Para corregir una infracción de esta regla, cambie la implementación por lo que es 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. Aunque Dispose para el objeto se conoce como con seguridad 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 externa using (instrucción), el Dispose método del recurso anidado libera el recurso incluido.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 externo utilizando la instrucción se haya liberado 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 externa using (instrucción), el stream se libera el objeto de una segunda vez.At the end of the outer using statement, the stream object is released a second time. La segunda versión constituye 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 bloque en lugar de la externa 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

System.IDisposableSystem.IDisposable
Patrón de DisposeDispose Pattern