Convertir Enum à Chaîne
Qui est la meilleure façon de convertir un Enum pour une Chaîne .NET 3.5?
- Enum.GetName
- Enum.Format
- toString
Pourquoi devrais-je préférer l'un de ces plus que les autres? N'est-on effectuer mieux?
- J'ai cherché et n'a pas pu trouver un duplicata. Si vous pouvez fournir un lien je vais supprimer cette question.
- parfois, à l'aide d'une instruction switch est pas la meilleure pratique (quand vous avez de grandes énumérations), vous pouvez utiliser Dict<> au lieu de cela
- Si vous voulez de meilleures performances, vous pouvez utiliser la classe décrite dans cet article codeproject.com/KB/dotnet/enum.aspx. L'utilisation ressemblera à ceci Enum<YourEnum>.ToString(yourValue) ou Enum<YourEnum>.ToString((int)yourValue)
- Le codage de ne pas casser les dotfuscation est la quintessence de la queue qui remue le chien. SW les producteurs ne sont pas de la pensée, "nous allons faire une grande application pour dotfuscator a quelque chose à faire." Dofuscator existe pour faciliter le développement SW. Si il ne peut pas le faire ... peut-il!
Vous devez vous connecter pour publier un commentaire.
De C#6 le meilleur moyen d'obtenir le nom d'un enum est le nouveau
nameof
opérateur:Cela fonctionne au moment de la compilation, avec l'enum d'être remplacé par la chaîne dans le résultat compilé, qui à son tour signifie que ce est la façon la plus rapide possible.
Toute utilisation d'enum noms d'interférer avec l'obfuscation du code, si vous considérez l'obscurcissement de noms enum intéressant ou important - c'est probablement une toute autre question.
nameof(variableEnum)
sera"variableEnum"
. Il tient (au moment de la construction) le nom de la field/property/param/variable non le valeur.Travaille pour notre projet...
Dans mes tests,
Enum.GetName
a été plus rapide et en marge décente. En interneToString
appelsEnum.GetName
. À partir de la source pour .NET 4.0, l'essentiel:Je ne peux pas dire que c'est la raison pour sûr, mais les tests de l'état est plus rapide que les autres. Les deux appels impliquent de boxe (en fait, ils sont le reflet d'appels, vous êtes essentiellement de la récupération des noms de champ) et peut être lent à votre goût.
Si la vitesse n'est pas perceptible, je n'aurais pas les soins et l'utilisation
ToString
car il offre un beaucoup plus propre appel. Le contrasteavec
Tous ces à l'interne retrouvez l'appel d'une méthode appelée
InternalGetValueAsString
. La différence entreToString
etGetName
serait queGetName
a pour vérifier quelques choses d'abord:GetType
sur la valeur de vérifier cela..ToString
n'a pas à se préoccuper de ces questions ci-dessus, car elle est appelée sur une instance de la classe elle-même, et non sur le passé de la version, par conséquent, en raison du fait que le.ToString
méthode n'a pas les mêmes problèmes de vérification que les méthodes statiques, j'en conclurai que.ToString
est le moyen le plus rapide pour obtenir la valeur sous forme de chaîne.Du mieux que je peux trouver est cette question sans rapport, sur MSDN, qui contient un fragment de code XML qui répond à cette question. L'une de ces méthodes partagent le même défaut: ils appellent
enum.toString()
, qui ne fonctionne pas correctement lors de l'utilisation Dotfuscation. D'autres préoccupations concernent indirects de boxe (GetName et Format). Malheureusement, je ne trouve pas de raisons de performances pour l'utilisation de tout ce qui précède.De la paraphrase de la extrait de code xml suivant,
Enum.GetName(...)
C'est le plus élégant de la méthode qui est signifié pour elle.
Bien que je ne vois pas de problèmes avec l'appel de
.ToString()
comme il est tout simplement plus courte.Avec C# 6 de la syntaxe, vous pouvez utiliser:
Enum.GetName()
Format()
est vraiment juste un wrapper autour deGetName()
avec une mise en forme de la fonctionnalité (ouInternalGetValueAsString()
pour être exact).ToString()
est à peu près le même queFormat()
. Je pense queGetName()
est la meilleure option car il est tout à fait évident qu'il ne l'est pour n'importe qui qui lit la source.- Je créer une "Description" de la méthode d'extension et de l'attacher à l'enum afin que je puisse obtenir vraiment conviviale de nommage qui comprend des espaces et du boîtier. Je n'ai jamais aimé l'aide de la valeur d'enum comme affichables texte parce que c'est quelque chose que nous avons utilisée par les développeurs pour créer un code plus lisible. Il n'est pas prévu pour l'INTERFACE utilisateur à des fins d'affichage. Je veux être en mesure de modifier l'INTERFACE utilisateur sans passer par et la modification des enums partout.
Je ne sais pas ce qu'est le "préféré" la méthode est (demandez à 100 personnes et obtenez 100 des opinions différentes), mais de faire ce qui est plus simple et ce qui fonctionne.
GetName
fonctionne mais nécessite beaucoup plus de frappes.ToString()
semble faire le travail très bien.Ce serait trop de travail.
Pour VB aficionados:
Simple: enum noms dans une Liste: