Condividi tramite


CA2215: I metodi Dispose devono chiamare il metodo Dispose della classe base

TypeName

DisposeMethodsShouldCallBaseClassDispose

CheckId

CA2215

Category

Microsoft.Usage

Breaking Change

Non sostanziale

Causa

Un tipo che implementa System.IDisposable eredita da un tipo che implementa anch'esso IDisposable. Il metodo Dispose del tipo che eredita non chiama il metodo Dispose del tipo padre.

Descrizione della regola

Se un tipo eredita da un tipo Disposable, deve chiamare il metodo Dispose del tipo di base dall'interno del proprio metodo Dispose. Chiamando il metodo del tipo di base Elimina si garantisce che tutte le risorse create dal tipo di base vengano rilasciate.

Come correggere le violazioni

Per correggere una violazione di questa regola, chiamare base.Dispose nel metodo Dispose.

Esclusione di avvisi

L'esclusione di un avviso da questa regola è sicura se la chiamata a base.Dispose viene effettuata a un livello di chiamata più profondo rispetto a quanto controllato dalla regola.

Esempio

Nell'esempio riportato di seguito viene illustrato un tipo TypeA che implementa IDisposable.

using System;  

namespace UsageLibrary
{
    public class  TypeA :IDisposable
    {

        protected virtual void Dispose(bool disposing) 
        {
            if (disposing) 
            {
                // Dispose managed resources
            }

            // Free native resources
        }

        public void Dispose()
        {

                Dispose(true);

                GC.SuppressFinalize(this);

        }

        // Disposable types implement a finalizer.
        ~TypeA()
        {
            Dispose(false);
        }
    }
}

Nell'esempio riportato di seguito viene illustrato un tipo TypeB che eredita da TypeA e chiama correttamente il relativo metodo Dispose.

Imports System

Namespace UsageLibrary

  Public Class TypeB
      Inherits TypeA

      Protected Overrides Sub Finalize()
          Try
              Dispose(False)
          Finally
              MyBase.Finalize()
          End Try
      End Sub

  End Class

End Namespace

Vedere anche

Riferimenti

Implementazione dei metodi Finalize e Dispose per la pulizia delle risorse non gestite

System.IDisposable