CA1802: Używaj literałów wszędzie, gdzie jest to odpowiednie
TypeName |
UseLiteralsWhereAppropriate |
CheckId |
CA1802 |
Kategoria |
Microsoft.Performance |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Pole jest zadeklarowane jako static i readonly (Shared i ReadOnly w Visual Basic) i jest zainicjowane wartością, która jest obliczana w czasie kompilacji.
Opis reguły
Wartość pola staticreadonly jest obliczana w czasie wykonywania, gdy wywoływany jest konstruktor statyczny dla deklarowanego typu.Jeśli pole staticreadonly jest inicjowane, gdy jest zadeklarowane a konstruktor statyczny nie jest zadeklarowany jawnie, kompilator generuje konstruktor statyczny aby zainicjować pola.
Wartość pola const jest obliczana w czasie kompilacji i przechowywana w metadanych, co zwiększa wydajność w czasie wykonywania w porównaniu do pola staticreadonly.
Ponieważ wartość, przypisana do pola docelowego jest obliczalna w czasie kompilacji, należy zmienić deklarację na pole const, dzięki czemu wartość jest obliczana w czasie kompilacji, zamiast w czasie wykonywania.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, należy zastąpić modyfikatory static i readonly modyfikatorem const.
Kiedy pominąć ostrzeżenia
Jest bezpieczne, aby pomijać ostrzeżenia od tej reguły lub wyłączyć regułę, jeśli wydajność nie jest problemem.
Przykład
Poniższy przykład pokazuje typ, UseReadOnly który narusza regułę oraz typ, UseConstant, który spełnia regułę.
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";
}
}