CA2015: Definiera inte finalizers för typer som härleds från MemoryManager<T>
Property | Värde |
---|---|
Regel-ID | CA2015 |
Title | Definiera inte finalizers för typer som härletts från MemoryManager<T> |
Kategori | Tillförlitlighet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Som varning |
Orsak
Definiera finalizers för typer som härletts från MemoryManager<T>
Regelbeskrivning
Att lägga till en finalizer till en typ som härletts från MemoryManager<T> är sannolikt en indikation på en bugg, eftersom det antyder att en intern resurs som kan ha delats ut i en Span<T> rensas och eventuellt medan den fortfarande används av Span<T>.
Kommentar
Klassen MemoryManager<T> är avsedd för avancerade scenarier. De flesta utvecklare behöver inte använda det.
Så här åtgärdar du överträdelser
Du kan åtgärda överträdelsen genom att ta bort slutlösningsdefinitionen.
class DerivedClass <T> : MemoryManager<T>
{
public override bool Dispose(bool disposing)
{
if (disposing)
{
_handle.Dispose();
}
}
...
// Violation occurs, remove the finalizer to fix the warning.
~DerivedClass() => Dispose(false);
}
När du ska ignorera varningar
Det är säkert att förhindra en överträdelse av den här regeln om avsikten är att skapa en slutförare för felsökning eller validering.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA2015
// The code that's violating the rule is on this line.
#pragma warning restore CA2015
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA2015.severity = none
Om du vill inaktivera hela den här regelkategorin anger du allvarlighetsgraden för kategorin till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.