Share via


CA1802: letterlijke waarden gebruiken, indien van toepassing

Eigenschappen Weergegeven als
Regel-id CA1802
Titel Letterlijke gegevens gebruiken waar van toepassing
Categorie Prestaties
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 8 Nee

Oorzaak

Een veld wordt gedeclareerd static en readonly (Shared en ReadOnly in Visual Basic) en wordt geïnitialiseerd met een waarde die kan worden gecompileerd tijdens het compileren.

Deze regel kijkt standaard alleen naar extern zichtbare, statische, leesbare velden, maar dit is configureerbaar.

Beschrijving van regel

De waarde van een static readonly veld wordt berekend tijdens runtime wanneer de statische constructor voor het declaratietype wordt aangeroepen. Als het static readonly veld wordt geïnitialiseerd wanneer het wordt gedeclareerd en een statische constructor niet expliciet wordt gedeclareerd, verzendt de compiler een statische constructor om het veld te initialiseren.

De waarde van een const veld wordt berekend tijdens het compileren en opgeslagen in de metagegevens, waardoor de runtimeprestaties worden verbeterd wanneer het wordt vergeleken met een static readonly veld.

Omdat de waarde die aan het doelveld is toegewezen, kan worden gecompputeerd tijdens het compileren, wijzigt u de declaratie in een const veld, zodat de waarde tijdens het compileren wordt berekend in plaats van tijdens runtime.

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, vervangt u de static en readonly modifiers door de const wijzigingsfunctie.

Notitie

Het gebruik van de const modifier wordt niet aanbevolen voor alle scenario's.

Wanneer waarschuwingen onderdrukken

Het is veilig om een waarschuwing van deze regel te onderdrukken of de regel uit te schakelen als de prestaties niet van belang zijn.

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

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Code configureren om te analyseren

Gebruik de volgende opties om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.

U kunt deze opties configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (prestaties) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.

Specifieke API-oppervlakken opnemen

U kunt instellen op welke onderdelen van uw codebase deze regel moet worden uitgevoerd, op basis van hun toegankelijkheid. Als u bijvoorbeeld wilt opgeven dat de regel alleen moet worden uitgevoerd op het niet-openbare API-oppervlak, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Vereiste modifiers

U kunt deze regel zo configureren dat de vereiste veldaanpassingen worden overschreven. staticreadonly Standaard zijn beide vereiste modifiers voor velden die worden geanalyseerd. U kunt dit overschrijven naar een door komma's gescheiden waarden van een of meer wijzigingswaarden uit de onderstaande tabel:

Optiewaarde Samenvatting
none Geen wijzigingsvereiste.
static of Shared Moet worden gedeclareerd als 'statisch' ('Gedeeld' in Visual Basic).
const Moet worden gedeclareerd als 'const'.
readonly Moet worden gedeclareerd als 'readonly'.

Als u bijvoorbeeld wilt opgeven dat de regel moet worden uitgevoerd op zowel statische als exemplaarvelden, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:

dotnet_code_quality.CA1802.required_modifiers = none

Voorbeeld

In het volgende voorbeeld ziet u een type, UseReadOnlydat in strijd is met de regel en een type, UseConstantdie voldoet aan de regel.

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