c# enum equals() vs ==
Dans le cas de l'utilisation des enums, est-il préférable d'utiliser:
if (enumInstance.Equals(MyEnum.SomeValue))
ou à utiliser
if (enumInstance == MyEnum.SomeValue)
Y a des considérations importantes à l'aide de l'un vs l'autre?
- J'ai l'impression que cela a probablement été répondu avant, je n'arrive pas à trouver où. Si il a été répondu laissez-moi savoir et je vais supprimé cette question
- à peu près chaque question posée sur a DONC été demandé ici avant... il devrait y avoir un badge pour poser une unique question.
- stackoverflow.com/questions/814878/...
- Il y a un petit fil à ce sujet sur MSDN
- haha ouais... j'ai une de ces trop. 🙂
- Lorsque vous appelez enumInstance.Est égale à la enum paramètre doit être encadré d'égal à Égal prend l'objet en tant que paramètre, donc pour éviter la boxe il est préférable d'utiliser ==, si vous le pouvez
Vous devez vous connecter pour publier un commentaire.
Si le type de compilation de
enumInstance
est le type enum, vous êtes très bien avec==
.Si le type de compilation de
enumInstance
estEnum
,ValueType
ouObject
, vous devez utiliserEquals
. (Vous obtiendrez une erreur de compilation si vous essayez d'utiliser==
dans ce cas.)Noter que votre enum actuellement viole .NET conventions de nommage - il devrait normalement être
MyEnum.Value
.params Func<T, object>[]
comparaison de la méthode d'extension sur une collection générique.L'aide d' == au lieu d'égal à Égal est un peu plus rapide, il n'est pas nécessaire de cocher les énumérations et aucun des appels de fonctions nécessaires voici un exemple de code c# et MSIL généré pour elle:
MSIL:
Comme vous pouvez le voir == génère ceq l'instruction, de la méthode Equals réalisée boxe et callvirt
Il y a un cas que les autres réponses ici n'ont pas mentionné que peut aider les autres.
Avec c# le type sous-jacent d'un enum est une intégrale. Parce que c'est une intégrale, vous pouvez logiquement OU les énumérations ensemble.
Lorsque vous utilisez l'une des méthodes ci-dessus pour l'égalité échouera si les énumérations sont logiquement OU souhaitez ensemble.
Donc, pour certains cas particuliers, tels que l'utilisation des enums que des drapeaux, vous devrez logiquement ET dans le cas où vous essai pour avec en premier lieu avant de la vérification de l'égalité.
ou
Strictement parlant, il est plus sûr d'utiliser "==" avec des enums.
Une liste complète possible des types enum peut être trouvé ici: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/enum
Comme une extension de Jon Skeet la vieille réponse, il est vrai que vous obtiendrez une erreur de compilation lorsque vous comparez
Enum == YourActualEnum.Value
, cependant, lorsque vous neEnum == Enum
, qui compile très bien, il retourne faux tout le temps.si vous essayez ce qui suit sur une application de test, vous aurez la suite
vous obtiendrez les résultats suivants
Method 1 result: False
Method 2 result: True
Method 3 result: True
Si vous vous demandez pourquoi voudriez-vous jamais comparer Enum contre Enum....Je l'ai découvert en essayant d'être intelligent tout en créant un EnumConverter et un FlagConvert pour un projet WPF. Là, vous ne recevrez qu'un objet de valeur comme paramètre, et pour le drapeau convertisseur plus précisément, je voulais offrir un texte spécial pour quand aucun indicateur n'a été sélectionné (c'est à dire l'enum a une valeur de 0, ce qui n'a pas de membre statique pour elle).
Rien d'autre a travaillé (y compris la valeur.Est égal à(0), la valeur.Est égal à((int)0) ) sauf que c':