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