CA2215: Metody Dispose by měly volat uvolnění třídy Base
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2215 |
Název | Metody Dispose by měly volat uvolnění základní třídy |
Kategorie | Využití |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 8 | No |
Příčina
Typ, který implementuje System.IDisposable dědí z typu, který také implementuje IDisposable. Metoda Dispose zděděného typu nevolá Dispose metodu nadřazeného typu.
Popis pravidla
Pokud typ dědí z uvolnitelného typu, musí volat Dispose metodu základního typu z vlastní Dispose metody. Volání metody základního typu Dispose
zajišťuje uvolnění všech prostředků vytvořených základním typem.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, zavolejte base
Dispose v metoděDispose.
Kdy potlačit upozornění
Upozornění z tohoto pravidla je bezpečné potlačit, pokud se volání base
Dispose vyskytuje na hlubší úrovni volání, než kontroluje pravidlo.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA2215
// The code that's violating the rule is on this line.
#pragma warning restore CA2215
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA2215.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Příklad
Následující příklad ukazuje dva typy, TypeA
které implementuje IDisposablea TypeB
které dědí z typu TypeA
a správně volá jeho Dispose metodu.
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);
}
}
}
}