CA1802: Używaj literałów wszędzie, gdzie jest to odpowiednie
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA1802 |
Stanowisko | Używaj literałów w odpowiednich miejscach |
Kategoria | Wydajność |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 8 | Nie. |
Przyczyna
Pole jest zadeklarowane static
i readonly
(Shared
i ReadOnly
w Visual Basic) i jest inicjowane przy użyciu wartości, która jest kompilowana w czasie kompilacji.
Domyślnie ta reguła sprawdza tylko pola widoczne zewnętrznie, statyczne, tylko do odczytu, ale jest to możliwe do skonfigurowania.
Opis reguły
Wartość static readonly
pola jest obliczana w czasie wykonywania, gdy wywoływany jest konstruktor statyczny dla typu deklarowania. static readonly
Jeśli pole jest inicjowane, gdy jest zadeklarowane, a konstruktor statyczny nie jest zadeklarowany jawnie, kompilator emituje konstruktor statyczny w celu zainicjowania pola.
Wartość const
pola jest obliczana w czasie kompilacji i przechowywana w metadanych, co poprawia wydajność czasu wykonywania w porównaniu z polem static readonly
.
Ponieważ wartość przypisana do pola docelowego jest obliczana w czasie kompilacji, zmień deklarację const
na pole, aby wartość była obliczana w czasie kompilacji zamiast w czasie wykonywania.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, zastąp static
modyfikatory i readonly
modyfikatorem const
.
Uwaga
Użycie modyfikatora const nie jest zalecane we wszystkich scenariuszach.
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie z tej reguły lub wyłączyć regułę, jeśli wydajność nie jest istotna.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA1802
// The code that's violating the rule is on this line.
#pragma warning restore CA1802
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA1802.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Konfigurowanie kodu do analizowania
Użyj poniższych opcji, aby skonfigurować, które części bazy kodu mają być uruchamiane w tej regule.
Można skonfigurować te opcje tylko dla tej reguły, dla wszystkich reguł, których dotyczy, lub dla wszystkich reguł w tej kategorii (Wydajność), do których ma ona zastosowanie. Aby uzyskać więcej informacji, zobacz Opcje konfiguracji reguły jakości kodu.
Uwzględnij określone powierzchnie interfejsu API
Możesz skonfigurować, na których częściach bazy kodu ma być uruchamiana ta reguła, na podstawie ich ułatwień dostępu. Aby na przykład określić, że reguła powinna być uruchamiana tylko na powierzchni niepublicznego interfejsu API, dodaj następującą parę klucz-wartość do pliku editorconfig w projekcie:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Wymagane modyfikatory
Tę regułę można skonfigurować tak, aby zastąpić wymagane modyfikatory pól. Domyślnie static
i readonly
są wymaganymi modyfikatorami pól, które są analizowane. Możesz zastąpić to przecinkiem rozdzielanym przecinkami na liście co najmniej jednej wartości modyfikatora z poniższej tabeli:
Wartość opcji | Podsumowanie |
---|---|
none |
Brak wymagania modyfikatora. |
static lub Shared |
Należy zadeklarować jako "static" ('Shared' w Visual Basic). |
const |
Należy zadeklarować jako "const". |
readonly |
Należy zadeklarować jako "readonly". |
Aby na przykład określić, że reguła powinna być uruchamiana względem pól statycznych i wystąpień, dodaj następującą parę klucz-wartość do pliku editorconfig w projekcie:
dotnet_code_quality.CA1802.required_modifiers = none
Przykład
W poniższym przykładzie przedstawiono typ , UseReadOnly
który narusza regułę i typ , UseConstant
który spełnia regułę.
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";
}