CA1802: Nach Möglichkeit Literale verwenden
TypeName |
UseLiteralsWhereAppropriate |
CheckId |
CA1802 |
Kategorie |
Microsoft.Performance |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein Feld wird als static und readonly deklariert (Shared und ReadOnly in Visual Basic) und mit einem Wert initialisiert, der zur Kompilierungszeit berechnet werden kann.
Regelbeschreibung
Der Wert eines static readonly-Felds wird zur Laufzeit berechnet, wenn der statische Konstruktor für den deklarierenden Typ aufgerufen wird. Wenn das static readonly-Feld zum Zeitpunkt des Deklarierens initialisiert wird und kein statischer Konstruktor explizit deklariert wird, gibt der Compiler einen statischen Konstruktor zum Initialisieren des Felds aus.
Der Wert eines const-Felds wird zur Kompilierungszeit berechnet und in den Metadaten gespeichert. Dadurch wird beim Vergleich mit einem static readonly-Feld die Laufzeitleistung gesteigert.
Da der dem verwendeten Feld zugewiesene Wert zur Kompilierungszeit berechnet werden kann, ändern Sie die Deklaration in ein const-Feld, sodass der Wert statt zur Laufzeit zur Kompilierungszeit berechnet wird.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, ersetzen Sie den static-Modifizierer und den readonly-Modifizierer durch den const-Modifizierer.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, bzw. die Regel kann deaktiviert werden, wenn das Leistungsverhalten nicht von Belang ist.
Beispiel
Das folgende Beispiel zeigt einen Typ, UseReadOnly, der gegen die Regel verstößt, und einen Typ UseConstant, der der Regel entspricht.
Imports System
Namespace PerformanceLibrary
' 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
using System;
namespace PerformanceLibrary
{
// 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";
}
// This class satisfies the rule.
public class UseConstant
{
const int x = 3;
const double y = x + 2.1;
const string s = "const";
}
}