CA1802: Nach Möglichkeit Literale verwenden.
Eigenschaft | Wert |
---|---|
Regel-ID | CA1802 |
Titel | Nach Möglichkeit Literale verwenden. |
Kategorie | Leistung |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 8 aktiviert | Nein |
Ursache
Ein Feld wird als static
und readonly
(Shared
und ReadOnly
in Visual Basic) deklariert und mit einem Wert initialisiert, der zur Kompilierzeit berechenbar ist.
Standardmäßig werden mit dieser Regel nur extern sichtbare Felder überprüft, die statisch und schreibgeschützt sind, aber dies ist konfigurierbar.
Regelbeschreibung
Der Wert eines static readonly
-Felds wird zur Laufzeit berechnet, wenn der statische Konstruktor für den deklarierenden Typ aufgerufen wird. Wenn das Feld static readonly
bei der Deklarierung initialisiert wird und kein statischer Konstruktor explizit deklariert wurde, gibt der Compiler einen statischen Konstruktor aus, um das Feld zu initialisieren.
Der Wert eines const
-Felds wird zur Kompilierzeit berechnet und in den Metadaten gespeichert. Dadurch wird die Laufzeitleistung bei einem Vergleich mit einem static readonly
-Feld verbessert.
Da der dem Zielfeld zugewiesene Wert zur Kompilierzeit berechnet werden kann, ändern Sie die Deklaration in ein const
-Feld, damit der Wert statt zur Laufzeit zur Kompilierzeit berechnet wird.
Behandeln von Verstößen
Sie können einen Verstoß gegen diese Regel korrigieren, indem Sie die Modifizierer static
und readonly
durch den Modifizierer const
ersetzen.
Hinweis
Die Verwendung des const-Modifizierers wird nicht für alle Szenarios empfohlen.
Wann sollten Warnungen unterdrückt werden?
Wenn die Leistung nicht relevant ist, können Warnungen für diese Regel bedenkenlos unterdrückt werden. Sie können die Regel in diesem Fall auch deaktivieren.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA1802
// The code that's violating the rule is on this line.
#pragma warning restore CA1802
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none
fest.
[*.{cs,vb}]
dotnet_diagnostic.CA1802.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.
Konfigurieren des zu analysierenden Codes
Mit den folgenden Optionen können Sie konfigurieren, für welche Teile Ihrer Codebasis diese Regel ausgeführt werden soll.
Sie können diese Optionen nur für diese Regel, für alle zutreffenden Regeln oder für alle zutreffenden Regeln in dieser Kategorie (Leistung) konfigurieren. Weitere Informationen finden Sie unter Konfigurationsoptionen für die Codequalitätsregel.
Einschließen bestimmter API-Oberflächen
Sie können je nach Zugänglichkeit festlegen, für welche Bestandteile Ihrer Codebasis diese Regel ausgeführt wird. Sie können beispielsweise festlegen, dass die Regel nur für die nicht öffentliche API-Oberfläche ausgeführt werden soll, indem Sie einer EDITORCONFIG-Datei in Ihrem Projekt das folgende Schlüssel-Wert-Paar hinzufügen:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Erforderliche Modifizierer
Sie können diese Regel so konfigurieren, dass die erforderlichen Feldmodifizierer überschrieben werden. Standardmäßig sind die Modifizierer static
und readonly
für Felder erforderlich, die analysiert werden. Sie können diese mit einem oder mehreren Modifiziererwerten (durch Trennzeichen getrennt) aus der folgenden Tabelle überschreiben:
Optionswert | Zusammenfassung |
---|---|
none |
Keine Modifiziereranforderung |
static oder Shared |
Muss als static deklariert werden (Shared in Visual Basic) |
const |
Muss als const deklariert werden |
readonly |
Muss als readonly deklariert werden |
Sie können beispielsweise festlegen, dass die Regel für statische Felder und Instanzfelder ausgeführt werden soll, indem Sie einer EDITORCONFIG-Datei in Ihrem Projekt das folgende Schlüssel-Wert-Paar hinzufügen:
dotnet_code_quality.CA1802.required_modifiers = none
Beispiel
Das folgende Beispiel zeigt den Typ UseReadOnly
, der gegen die Regel verstößt, und den Typ UseConstant
, der sie erfüllt.
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";
}