Sdílet prostřednictvím


CA1802: Použijte literály, kde je to vhodné

Vlastnost Hodnota
ID pravidla CA1802
Název Použijte literály, kde je to vhodné
Kategorie Výkon
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 9 No

Příčina

Pole je deklarováno static a readonly (Shared a ReadOnly v jazyce Visual Basic) a inicializuje se hodnotou, která je v době kompilace computable.

Ve výchozím nastavení se toto pravidlo dívá jenom na externě viditelná, statická pole jen pro čtení, ale dá se konfigurovat.

Popis pravidla

Hodnota static readonly pole se vypočítá za běhu, když je volána statická konstruktor pro deklarující typ. static readonly Pokud je pole inicializováno, když je deklarováno a statický konstruktor není deklarován explicitně, kompilátor vygeneruje statický konstruktor pro inicializaci pole.

Hodnota const pole se vypočítá v době kompilace a uloží se v metadatech, což zlepšuje výkon za běhu v porovnání s polem static readonly .

Vzhledem k tomu, že hodnota přiřazená cílovému poli je v době kompilace kompuovatelná, změňte deklaraci na const pole tak, aby se hodnota počítala v době kompilace místo v době běhu.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, nahraďte static modifikátor a readonly modifikátory modifikátorem const .

Poznámka:

Použití modifikátoru const se nedoporučuje pro všechny scénáře.

Kdy potlačit upozornění

Pokud se výkon netýká, je bezpečné potlačit upozornění z tohoto pravidla nebo pravidlo zakázat.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

#pragma warning disable CA1802
// The code that's violating the rule is on this line.
#pragma warning restore CA1802

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

[*.{cs,vb}]
dotnet_diagnostic.CA1802.severity = none

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Konfigurace kódu pro analýzu

Pomocí následujících možností můžete nakonfigurovat, pro které části základu kódu se má toto pravidlo spouštět.

Tyto možnosti můžete nakonfigurovat jenom pro toto pravidlo, pro všechna pravidla, která platí, nebo pro všechna pravidla v této kategorii (Výkon), na která platí. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.

Zahrnutí konkrétních povrchů rozhraní API

Na základě přístupnosti můžete nakonfigurovat, na kterých částech základu kódu se má toto pravidlo spouštět. Pokud chcete například určit, že pravidlo by se mělo spouštět jenom na neveřejné ploše rozhraní API, přidejte do souboru .editorconfig v projektu následující pár klíč-hodnota:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Požadované modifikátory

Toto pravidlo můžete nakonfigurovat tak, aby přepsaly požadované modifikátory polí. Ve výchozím nastavení static readonly jsou oba požadované modifikátory polí, která se analyzují. Můžete to přepsat na čárku oddělenou od jedné nebo více modifikačních hodnot z následující tabulky:

Hodnota možnosti Shrnutí
none Žádný požadavek modifikátoru.
static nebo Shared Musí být deklarována jako statická (Shared v jazyce Visual Basic).
const Musí být deklarována jako "const".
readonly Musí být deklarována jako "jen pro čtení".

Pokud chcete například určit, že pravidlo by se mělo spouštět pro statická pole i pole instance, přidejte do souboru .editorconfig v projektu následující dvojici klíč-hodnota:

dotnet_code_quality.CA1802.required_modifiers = none

Příklad

Následující příklad ukazuje typ, UseReadOnlykterý porušuje pravidlo a typ, UseConstantkterý splňuje pravidlo.

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