CA1802: Använd literaler där det är lämpligt
Property | Värde |
---|---|
Regel-ID | CA1802 |
Title | Använd literaler där det är lämpligt |
Kategori | Prestanda |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | 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.
Varning
För offentligt eller externt synliga medlemmar kan det leda till problem om du ändrar static readonly
till const
.
const
värden bäddas in i beroende sammansättningar vid kompileringstillfället, så ändringar i bibliotekets värde kanske inte sprids, vilket kan orsaka fel. Om värdet för din medlem kan ändras i framtiden kan du utelämna den här regeln.
Kommentar
Att använda const
är säkert för private
medlemmar och i allmänhet säkert för internal
medlemmar om de inte exponeras via InternalsVisibleTo
eller distribueras separat.
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
Kommentar
Ersätt den XXXX
delen av CAXXXX
med ID:t för den tillämpliga regeln.
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";
}