Share via


CA1859: Använd konkreta typer när det är möjligt för bättre prestanda

Property Värde
Regel-ID CA1859
Title Använd konkreta typer när det är möjligt för bättre prestanda
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Introducerad version .NET 8
Aktiverad som standard i .NET 8 Som förslag

Orsak

Koden använder gränssnittstyper eller abstrakta typer, vilket leder till onödiga gränssnittsanrop eller virtuella anrop.

Regelbeskrivning

Den här regeln rekommenderar att du uppgraderar typen av specifika lokala variabler, fält, egenskaper, metodparametrar och metodreturtyper från gränssnittstyper eller abstrakta typer till konkreta typer när det är möjligt. Användning av konkreta typer leder till kod som genereras av högre kvalitet genom att minimera kostnaderna för virtuella eller gränssnittsutskick och aktivera inlining.

Den här regeln rapporterar endast överträdelser när det finns virtuella anrop eller gränssnittsanrop som faktiskt kan undvikas med hjälp av en konkret typ.

Så här åtgärdar du överträdelser

Uppgradera de typer som rekommenderas av regeln. I allmänhet påverkar det inte kodens beteende att ändra typen, men det förbättrar dess prestanda.

Exempel

Följande kodfragment visar ett brott mot CA1859:

abstract class A
{
    public virtual void M() { }
}

sealed class B : A
{ }

internal class C
{
    private readonly A _a = new B();

    public void Trigger()
    {
        // This performs a virtual call because
        // _a is defined as an abstract class.
        _a.M();
    }
}

Följande kodfragment åtgärdar överträdelsen:

abstract class A
{
    public virtual void M() { }
}

sealed class B : A
{ }

internal class C
{
    private readonly B _b = new B();

    public void Trigger()
    {
        _b.M();
    }
}

När du ska ignorera varningar

Det är säkert att ignorera en varning om prestanda inte är ett problem.

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 CA1859
// The code that's violating the rule is on this line.
#pragma warning restore CA1859

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.CA1859.severity = none

Mer information finns i Så här utelämnar du kodanalysvarningar.