CA1063: Implemente IDisposable correctamenteCA1063: Implement IDisposable correctly

TypeNameTypeName ImplementIDisposableCorrectlyImplementIDisposableCorrectly
Identificador de comprobaciónCheckId CA1063CA1063
CategoríaCategory Microsoft.DesignMicrosoft.Design
Cambio problemáticoBreaking Change Poco problemáticoNon-breaking

MotivoCause

El System.IDisposable interfaz no se implementa correctamente.The System.IDisposable interface is not implemented correctly. Posibles razones para esto incluyen:Possible reasons for this include:

  • IDisposable se vuelva a implementar en la clase.IDisposable is reimplemented in the class.

  • Finalizar se reoverridden.Finalize is reoverridden.

  • Dispose() se reemplaza.Dispose() is overridden.

  • No es público, el método Dispose() sealed, o con nombre Dispose.The Dispose() method is not public, sealed, or named Dispose.

  • Dispose (bool) no está protegido, virtual o sin sellar.Dispose(bool) is not protected, virtual, or unsealed.

  • En tipos no sellados, Dispose() debe llamar a Dispose (true).In unsealed types, Dispose() must call Dispose(true).

  • Para tipos no sellados, la implementación Finalize no llama a uno o ambos Dispose (bool) o el finalizador de la clase base.For unsealed types, the Finalize implementation does not call either or both Dispose(bool) or the base class finalizer.

Infracción de cualquiera de estos patrones desencadena la advertencia CA1063.Violation of any one of these patterns triggers warning CA1063.

Cada tipo no sellado que declara e implementa el IDisposable interfaz debe proporcionar su propio método Dispose (bool) void virtual protegido.Every unsealed type that declares and implements the IDisposable interface must provide its own protected virtual void Dispose(bool) method. Dispose() debe llamar a Dispose (true) y el finalizador debe llamar a Dispose (false).Dispose() should call Dipose(true), and the finalizer should call Dispose(false). Si crea un tipo no sellado que declara e implementa el IDisposable interfaz, debe definir Dispose (bool) y llamarlo.If you create an unsealed type that declares and implements the IDisposable interface, you must define Dispose(bool) and call it. Para obtener más información, consulte limpiar recursos no administrados (Guía de. NET) y patrón Dispose.For more information, see Clean up unmanaged resources (.NET guide) and Dispose pattern.

Descripción de la reglaRule description

Todos los IDisposable tipos deben implementar la patrón Dispose correctamente.All IDisposable types should implement the Dispose pattern correctly.

Cómo corregir infraccionesHow to fix violations

Examine el código y determinar cuál de las siguientes resoluciones corregirá esta infracción:Examine your code and determine which of the following resolutions will fix this violation:

  • Quitar IDisposable en la lista de interfaces que se implementan por su tipo y anular la implementación de Dispose de clase base en su lugar.Remove IDisposable from the list of interfaces that are implemented by your type, and override the base class Dispose implementation instead.

  • Quite el finalizador del tipo, invalide Dispose (bool disposing) y coloque la lógica de finalización en la ruta de acceso del código donde 'disposing' es false.Remove the finalizer from your type, override Dispose(bool disposing), and put the finalization logic in the code path where 'disposing' is false.

  • Reemplace Dispose (bool disposing) y coloque la lógica de dispose en la ruta de acceso del código donde 'disposing' es true.Override Dispose(bool disposing), and put the dispose logic in the code path where 'disposing' is true.

  • Asegúrese de que Dispose() se ha declarado como público y sealed.Make sure that Dispose() is declared as public and sealed.

  • Cambiar el nombre del método dispose para Dispose y asegúrese de que se declara como público y sealed.Rename your dispose method to Dispose and make sure that it's declared as public and sealed.

  • Asegúrese de que Dispose (bool) se declara como protegido, virtual y no sellados.Make sure that Dispose(bool) is declared as protected, virtual, and unsealed.

  • Modificar Dispose() para que llame a Dispose (true), a continuación, llama a SuppressFinalize en la instancia del objeto actual (this, o Me en Visual Basic) y, a continuación, se devuelve.Modify Dispose() so that it calls Dispose(true), then calls SuppressFinalize on the current object instance (this, or Me in Visual Basic), and then returns.

  • Modifique el finalizador para que se llama a Dispose (false) y, a continuación, se devuelve.Modify your finalizer so that it calls Dispose(false) and then returns.

  • Si crea un tipo no sellado que declara e implementa el IDisposable interfaz, asegúrese de que la implementación de IDisposable sigue el patrón descrito anteriormente en esta sección.If you create an unsealed type that declares and implements the IDisposable interface, make sure that the implementation of IDisposable follows the pattern that is described earlier in this section.

Cuándo Suprimir advertenciasWhen to suppress warnings

No suprima las advertencias de esta regla.Do not suppress a warning from this rule.

Ejemplo de pseudocódigoPseudo-code example

El pseudocódigo siguiente proporciona un ejemplo general de cómo se debe implementar Dispose (bool) en una clase que utiliza managed y recursos nativos.The following pseudo-code provides a general example of how Dispose(bool) should be implemented in a class that uses managed and native resources.

public class Resource : IDisposable
{
    private IntPtr nativeResource = Marshal.AllocHGlobal(100);
    private AnotherResource managedResource = new AnotherResource();

    // Dispose() calls Dispose(true)
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    // NOTE: Leave out the finalizer altogether if this class doesn't
    // own unmanaged resources, but leave the other methods
    // exactly as they are.
    ~Resource()
    {
        // Finalizer calls Dispose(false)
        Dispose(false);
    }

    // The bulk of the clean-up code is implemented in Dispose(bool)
    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            // free managed resources
            if (managedResource != null)
            {
                managedResource.Dispose();
                managedResource = null;
            }
        }
        // free native resources if there are any.
        if (nativeResource != IntPtr.Zero)
        {
            Marshal.FreeHGlobal(nativeResource);
            nativeResource = IntPtr.Zero;
        }
    }
}

Vea tambiénSee also