Share via


CA2015: Definieer geen finalizers voor typen die zijn afgeleid van MemoryManager<T>

Eigenschappen Weergegeven als
Regel-id CA2015
Titel Definieer geen finalizers voor typen die zijn afgeleid van MemoryManager<T>
Categorie Betrouwbaarheid
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Als waarschuwing

Oorzaak

Finalizers definiëren voor typen die zijn afgeleid van MemoryManager<T>

Beschrijving van regel

Het toevoegen van een finalizer aan een type dat is afgeleid van MemoryManager<T> , is waarschijnlijk een indicatie van een bug, omdat het suggereert dat een systeemeigen resource die in een Span<T> is uitgeleverd, wordt opgeschoond en mogelijk terwijl deze nog steeds wordt gebruikt door de Span<T>.

Notitie

De MemoryManager<T> klasse is bedoeld voor geavanceerde scenario's. De meeste ontwikkelaars hoeven deze niet te gebruiken.

Schendingen oplossen

Als u de schending wilt oplossen, verwijdert u de finalizerdefinitie.

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);
}

Wanneer waarschuwingen onderdrukken

Het is veilig om een schending van deze regel te onderdrukken als de bedoeling is om een finalizer te maken voor foutopsporing of validatiedoeleinden.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

#pragma warning disable CA2015
// The code that's violating the rule is on this line.
#pragma warning restore CA2015

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

[*.{cs,vb}]
dotnet_diagnostic.CA2015.severity = none

Als u deze hele categorie regels wilt uitschakelen, stelt u de ernst voor de categorie none in op in het configuratiebestand.

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Zie ook