Share via


CA1802: Använd literaler där det är lämpligt

Property Värde
Regel-ID CA1802
Rubrik Använd literaler där det är lämpligt
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

Ett fält deklareras static och readonly (Shared och ReadOnly i Visual Basic) och initieras med ett värde som kan beräknas vid kompileringstillfället.

Som standard tittar den här regeln bara på externt synliga, statiska, skrivskyddade fält, men detta kan konfigureras.

Regelbeskrivning

Värdet för ett static readonly fält beräknas vid körning när den statiska konstruktorn för deklareringstypen anropas. Om fältet static readonly initieras när det deklareras och en statisk konstruktor inte deklareras explicit genererar kompilatorn en statisk konstruktor för att initiera fältet.

Värdet för ett const fält beräknas vid kompileringstillfället och lagras i metadata, vilket förbättrar körningsprestanda när det jämförs med ett static readonly fält.

Eftersom värdet som tilldelats målfältet kan beräknas vid kompileringstillfället ändrar du deklarationen till ett const fält så att värdet beräknas vid kompileringstid i stället för vid körning.

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

Om du vill åtgärda ett brott mot den här regeln ersätter static du modifierarna och readonly med const modifieraren.

Kommentar

Användning av beständighetsmodifieraren rekommenderas inte för alla scenarier.

När du ska ignorera varningar

Det är säkert att ignorera en varning från den här regeln eller inaktivera regeln om prestanda inte är något 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 CA1802
// The code that's violating the rule is on this line.
#pragma warning restore CA1802

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

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

Konfigurera kod för analys

Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.

Du kan konfigurera dessa alternativ för bara den här regeln, för alla regler som den gäller för eller för alla regler i den här kategorin (Prestanda) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.

Inkludera specifika API-ytor

Du kan konfigurera vilka delar av kodbasen som ska köras med den här regeln baserat på deras tillgänglighet. Om du till exempel vill ange att regeln endast ska köras mot den icke-offentliga API-ytan lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Nödvändiga modifierare

Du kan konfigurera den här regeln för att åsidosätta nödvändiga fältmodifierare. Som standard static och readonly är båda nödvändiga modifierare för fält som analyseras. Du kan åsidosätta detta till ett kommatecken som är avgränsat med ett eller flera modifierarvärden från tabellen nedan:

Alternativvärde Sammanfattning
none Inga krav på modifierare.
static eller Shared Måste deklareras som "statisk" ("Delad" i Visual Basic).
const Måste deklareras som "const".
readonly Måste deklareras som "readonly".

Om du till exempel vill ange att regeln ska köras mot både statiska fält och instansfält lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:

dotnet_code_quality.CA1802.required_modifiers = none

Exempel

I följande exempel visas en typ, UseReadOnly, som bryter mot regeln och en typ, UseConstant, som uppfyller regeln.

Imports System

Namespace ca1802

    ' This class violates the rule.
    Public Class UseReadOnly

        Shared ReadOnly x As Integer = 3
        Shared ReadOnly y As Double = x + 2.1
        Shared ReadOnly s As String = "readonly"

    End Class

    ' This class satisfies the rule.
    Public Class UseConstant

        Const x As Integer = 3
        Const y As Double = x + 2.1
        Const s As String = "const"

    End Class

End Namespace
// This class violates the rule.
public class UseReadOnly
{
    static readonly int x = 3;
    static readonly double y = x + 2.1;
    static readonly string s = "readonly";

    public void Print()
    {
        Console.WriteLine(s);
    }
}

// This class satisfies the rule.
public class UseConstant
{
    const int x = 3;
    const double y = x + 2.1;
    const string s = "const";
}