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 9 | 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. static
readonly
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
Opmerking
In het volgende voorbeeld ziet u een type, UseReadOnly
dat in strijd is met de regel en een type, UseConstant
die 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";
}