CA1802 : Utilisez des littéraux quand cela est approprié
Propriété | Value |
---|---|
Identificateur de la règle | CA1802 |
Titre | Utilisez des littéraux quand cela est approprié |
Catégorie | Performances |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | Non |
Cause
Un champ est déclaré static
et readonly
(Shared
et ReadOnly
en Visual Basic) et est initialisé avec une valeur pouvant être compilée au moment de la compilation.
Par défaut, cette règle examine uniquement les champs visibles en externe, statiques et en lecture seule, mais elle est configurable.
Description de la règle
La valeur d’un champ static readonly
est calculée au moment de l’exécution lorsque le constructeur statique du type déclarant est appelé. Si le champ static readonly
est initialisé lorsqu’il est déclaré et qu’un constructeur statique n’est pas déclaré explicitement, le compilateur émet un constructeur statique pour initialiser le champ.
La valeur d’un champ const
est calculée au moment de la compilation et stockée dans les métadonnées, ce qui améliore les performances d’exécution lorsqu’elle est comparée à un champ static readonly
.
La valeur assignée au champ ciblé étant calculable au moment de la compilation, remplacez la déclaration par un champ const
afin que la valeur soit calculée au moment de la compilation plutôt qu’à l’exécution.
Comment corriger les violations
Pour corriger une violation de cette règle, remplacez les modificateurs static
et readonly
par le modificateur const
.
Notes
L’utilisation du modificateur const n’est pas recommandée pour tous les scénarios.
Quand supprimer les avertissements
Si les performances ne constituent pas un problème, vous pouvez supprimer un avertissement de cette règle ou la désactiver en toute sécurité.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA1802
// The code that's violating the rule is on this line.
#pragma warning restore CA1802
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA1802.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Configurer le code à analyser
Utilisez l’option suivante pour configurer les parties de votre codebase sur lesquelles exécuter cette règle.
Vous pouvez configurer ces options pour cette règle uniquement, pour toutes les règles auxquelles elle s’applique ou pour toutes les règles de cette catégorie (Performances) auxquelles elle s’applique. Pour plus d’informations, consultez Options de configuration des règles de qualité du code.
Inclure des surfaces d’API spécifiques
Vous pouvez configurer les parties de votre codebase sur lesquelles exécuter cette règle, en fonction de leur accessibilité. Par exemple, pour spécifier que la règle doit s’exécuter uniquement sur la surface d’API non publique, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :
dotnet_code_quality.CAXXXX.api_surface = private, internal
Modificateurs requis
Vous pouvez configurer cette règle pour remplacer les modificateurs de champ requis. Par défaut, static
et readonly
sont deux modificateurs obligatoires pour les champs analysés. Vous pouvez remplacer ces modificateurs par une ou plusieurs valeurs de modificateurs séparées par des virgules provenant du tableau ci-dessous :
Valeur d’option | Récapitulatif |
---|---|
none |
Aucune exigence de modificateur. |
static ou Shared |
Doit être déclaré en tant que « statique » (« Partagé » en Visual Basic). |
const |
Doit être déclaré en tant que « const ». |
readonly |
Doit être déclaré en tant que « readonly ». |
Par exemple, pour spécifier que la règle doit s’exécuter sur des champs statiques et d’instance, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :
dotnet_code_quality.CA1802.required_modifiers = none
Exemple
L’exemple suivant montre un type, UseReadOnly
, qui enfreint la règle et un type, UseConstant
, conforme à la règle.
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";
}