CA2216: Typy usuwalne powinny deklarować finalizator
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2216 |
Tytuł | Typy możliwe do likwidacji powinny deklarować finalizator |
Kategoria | Użycie |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Typ implementujący System.IDisposableelement i zawiera pola sugerujące użycie niezarządzanych zasobów, nie implementuje finalizatora zgodnie z opisem w temacie System.Object.Finalize.
Opis reguły
Naruszenie tej reguły jest zgłaszane, jeśli typ jednorazowy zawiera pola następujących typów:
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, zaimplementuj finalizator, który wywołuje metodę Dispose .
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli typ nie jest implementowany IDisposable w celu zwolnienia niezarządzanych zasobów.
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 CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Przykład
W poniższym przykładzie pokazano typ naruszający tę regułę.
public class DisposeMissingFinalize : IDisposable
{
private bool disposed = false;
private IntPtr unmanagedResource;
[DllImport("native.dll")]
private static extern IntPtr AllocateUnmanagedResource();
[DllImport("native.dll")]
private static extern void FreeUnmanagedResource(IntPtr p);
DisposeMissingFinalize()
{
unmanagedResource = AllocateUnmanagedResource();
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
// Dispose of resources held by this instance.
FreeUnmanagedResource(unmanagedResource);
disposed = true;
// Suppress finalization of this disposed instance.
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}
public void Dispose()
{
Dispose(true);
}
// Disposable types with unmanaged resources implement a finalizer.
// Uncomment the following code to satisfy rule:
// DisposableTypesShouldDeclareFinalizer
// ~TypeA()
// {
// Dispose(false);
// }
}
Powiązane reguły
CA1816: Wywołaj poprawnie metodę GC.SuppressFinalize