Freigeben über


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