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, UseReadOnly
který porušuje pravidlo a typ, UseConstant
který 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";
}