CA1008 : Les enums doivent avoir la valeur zéro
Propriété | Value |
---|---|
Identificateur de la règle | CA1008 |
Titre | Les enums doivent avoir la valeur zéro |
Catégorie | Conception |
Le correctif est cassant ou non cassant | Non cassant : lorsque vous êtes invité à ajouter une valeur None à une énumération sans indicateur. Cassant : lorsque vous êtes invité à renommer ou à supprimer des valeurs d’énumération. |
Activé par défaut dans .NET 8 | Non |
Cause
Une énumération sans un System.FlagsAttribute appliqué ne définit pas un membre dont la valeur est égale à zéro. Ou une énumération qui a un FlagsAttribute appliqué définit un membre dont la valeur est zéro, mais son nom n’est pas « Aucun ». Ou l’énumération définit plusieurs membres à valeur zéro.
Par défaut, cette règle examine uniquement les énumérations visibles en externe, mais elle est configurable.
Description de la règle
La valeur par défaut d'une énumération non initialisée, comme d'autres types valeur, est zéro. Une énumération attribuée sans indicateur doit définir un membre de valeur zéro afin que la valeur par défaut soit une valeur valide de l'énumération. Si c’est le cas, nommez le membre « None » (ou l’un des noms autorisés supplémentaires). Sinon, affectez zéro au membre le plus fréquemment utilisé. Par défaut, si la valeur du premier membre d’énumération n’est pas définie dans la déclaration, sa valeur est égale à zéro.
Si une énumération qui a le FlagsAttribute appliqué définit un membre à valeur nulle, son nom doit être « None » (ou l’un des noms autorisés supplémentaires) pour indiquer qu’aucune valeur n’a été définie dans l’énumération. L’utilisation d’un membre à valeur zéro à tout autre but est contraire à l’utilisation de FlagsAttribute dans le sens où le AND
les opérateurs au niveau du bit OR
sont inutiles avec le membre. Cela implique qu’un seul membre doit être affecté à la valeur zéro. Si plusieurs membres ayant la valeur zéro se produisent dans une énumération attribuée d’indicateurs, Enum.ToString()
retourne des résultats incorrects pour les membres qui ne sont pas zéro.
Comment corriger les violations
Pour remédier à une infraction de cette règle pour les énumérations non attribuées d’indicateurs, définissez un membre ayant la valeur zéro ; il s’agit d’un changement non cassant. Pour les énumérations attribuées par des indicateurs qui définissent un membre à valeur zéro, nommez ce membre « None » et supprimez tous les autres membres dont la valeur est zéro ; c’est un changement cassant.
Quand supprimer les avertissements
Ne supprimez pas d’avertissement de cette règle, à l’exception des énumérations attribuées par des indicateurs précédemment expédiés.
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 CA1008
// The code that's violating the rule is on this line.
#pragma warning restore CA1008
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.CA1008.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 cette option pour cette règle uniquement, pour toutes les règles auxquelles elle s’applique ou pour toutes les règles de cette catégorie (Conception) 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
Noms de champs de valeur nulle supplémentaires
Dans .NET 7 et les versions ultérieures, vous pouvez configurer d’autres noms autorisés pour un champ d’énumération de valeur zéro, en plus de None
. Séparez plusieurs noms par le caractère |
. Le tableau suivant montre quelques exemples.
Valeur d'option | Résumé |
---|---|
dotnet_code_quality.CA1008.additional_enum_none_names = Never |
Autorise à la fois None et Never |
dotnet_code_quality.CA1008.additional_enum_none_names = Never|Nothing |
Autorise None , Never et Nothing |
Exemple
L’exemple suivant montre deux énumérations qui répondent à la règle et à une énumération, BadTraceOptions
, qui enfreint la règle.
using System;
namespace ca1008
{
public enum TraceLevel
{
Off = 0,
Error = 1,
Warning = 2,
Info = 3,
Verbose = 4
}
[Flags]
public enum TraceOptions
{
None = 0,
CallStack = 0x01,
LogicalStack = 0x02,
DateTime = 0x04,
Timestamp = 0x08,
}
[Flags]
public enum BadTraceOptions
{
CallStack = 0,
LogicalStack = 0x01,
DateTime = 0x02,
Timestamp = 0x04,
}
class UseBadTraceOptions
{
static void MainTrace()
{
// Set the flags.
BadTraceOptions badOptions =
BadTraceOptions.LogicalStack | BadTraceOptions.Timestamp;
// Check whether CallStack is set.
if ((badOptions & BadTraceOptions.CallStack) ==
BadTraceOptions.CallStack)
{
// This 'if' statement is always true.
}
}
}
}
Imports System
Namespace ca1008
Public Enum TraceLevel
Off = 0
AnError = 1
Warning = 2
Info = 3
Verbose = 4
End Enum
<Flags>
Public Enum TraceOptions
None = 0
CallStack = &H1
LogicalStack = &H2
DateTime = &H4
Timestamp = &H8
End Enum
<Flags>
Public Enum BadTraceOptions
CallStack = 0
LogicalStack = &H1
DateTime = &H2
Timestamp = &H4
End Enum
Class UseBadTraceOptions
Shared Sub Main1008()
' Set the flags.
Dim badOptions As BadTraceOptions =
BadTraceOptions.LogicalStack Or BadTraceOptions.Timestamp
' Check whether CallStack is set.
If ((badOptions And BadTraceOptions.CallStack) =
BadTraceOptions.CallStack) Then
' This 'If' statement is always true.
End If
End Sub
End Class
End Namespace
Règles associées
- CA2217 : Ne marquez pas les enums avec l'attribut FlagsAttribute
- CA1700 : Ne nommez pas les valeurs d’énumération 'Reserved'
- CA1712 : N'ajoutez pas le nom de type en guise de préfixe à des valeurs enum
- CA1028 : Enum Storage doit être Int32
- CA1027 : Marquer les enums avec FlagsAttribute