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 , UseReadOnlyktóry narusza regułę i typ , UseConstantktó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";
}