CA2215: Metody Dispose powinny wywoływać operację usuwania klasy bazowej
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2215 |
Tytuł | Metody Dispose powinny wywoływać metodę Dispose klasy bazowej |
Kategoria | Użycie |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Typ implementujący System.IDisposable dziedziczy z typu, który implementuje IDisposablerównież element . Dispose Metoda typu dziedziczonego nie wywołuje Dispose metody typu nadrzędnego.
Opis reguły
Jeśli typ dziedziczy z typu jednorazowego, musi wywołać Dispose metodę typu podstawowego z własnej Dispose metody. Wywołanie metody typu Dispose
podstawowego gwarantuje, że wszystkie zasoby utworzone przez typ podstawowy zostaną zwolnione.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, wywołaj metodę base
.Dispose Dispose
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli wywołanie metody base
.Dispose występuje na wyższym poziomie wywołania niż sprawdza reguła.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA2215
// The code that's violating the rule is on this line.
#pragma warning restore CA2215
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2215.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Przykład
W poniższym przykładzie przedstawiono dwa typy, TypeA
które implementują IDisposablemetodę , i TypeB
dziedziczą po typie TypeA
i poprawnie wywołuje metodę Dispose .
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);
}
}
}
}