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 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