Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| Proprietà | valore |
|---|---|
| ID regola | CA2215 |
| Title | I metodi Dispose devono chiamare Dispose della classe di base |
| Categoria | Utilizzo |
| La correzione causa un'interruzione o meno | Non rompente |
| Abilitato per impostazione predefinita in .NET 10 | No |
| Linguaggi applicabili | C# e Visual Basic |
Causa
Un tipo che implementa System.IDisposable eredita da un tipo che implementa anche IDisposable. Il metodo Dispose del tipo ereditario non chiama il metodo Dispose del tipo padre.
Descrizione regola
Se un tipo eredita da un tipo eliminabile, deve chiamare il Dispose metodo del tipo di base dall'interno del proprio Dispose metodo. La chiamata al metodo del tipo di Dispose base 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.
Quando eliminare gli avvisi
È sicuro sopprimere un avviso da questa regola se la chiamata a base.Dispose avviene a un livello di chiamata più profondo rispetto a quello controllato dalla regola.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA2215
// The code that's violating the rule is on this line.
#pragma warning restore CA2215
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.
[*.{cs,vb}]
dotnet_diagnostic.CA2215.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.
Esempio
Nell'esempio seguente vengono illustrati due tipi, TypeA che implementano IDisposablee TypeB che ereditano dal tipo TypeA e chiamano correttamente il Dispose relativo metodo.
Namespace ca2215
Public Class TypeA
Implements IDisposable
Protected Overridable Overloads Sub Dispose(disposing As Boolean)
If disposing Then
' dispose managed resources
End If
' free native resources
End Sub
Public Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
' Disposable types implement a finalizer.
Protected Overrides Sub Finalize()
Dispose(False)
MyBase.Finalize()
End Sub
End Class
Public Class TypeB
Inherits TypeA
Protected Overrides Sub Dispose(disposing As Boolean)
If Not disposing Then
MyBase.Dispose(False)
End If
End Sub
End Class
End Namespace
using System;
namespace ca2215
{
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);
}
}
public class TypeB : TypeA
{
protected override void Dispose(bool disposing)
{
if (!disposing)
{
base.Dispose(false);
}
}
}
}