Enum et de la performance
Mon application a beaucoup de différentes valeurs de recherche, ces valeurs ne sont pas jamais à changer, par exemple des Etats-unis. Plutôt que de les mettre dans des tables de base de données, j'aimerais utiliser les énumérations.
Mais, je me rends compte en le faisant de cette manière implique d'avoir un peu de enums et beaucoup de casting de "int" et "chaîne" à partir de mes énumérations.
Alternative, je vois quelqu'un a mentionné l'aide d'un Dictionnaire<> en tant que des tables de consultation, mais enum la mise en œuvre semble être plus propre.
Donc, je voudrais vous demander si le fait de garder et de passer un beaucoup d'énumérations et de la coulée d'être un problème de performance ou dois-je utiliser les tables de recherche approche, qui s'acquitte de mieux?
Edit: Le casting est nécessaire qu'une pièce d'identité pour être stockées dans des tables de base de données.
- Pourquoi vous avez besoin de les jeter?
- Sans doute parce que dans la base de données les valeurs seront des nombres entiers.
- C'est ce que j'ai deviné, mais il serait bon d'obtenir des précisions de l'OP.
- Oui, Jon est à droite.
- Ray, s'il vous plaît laissez-moi savoir ce que vous pensez de ma mise à jour de réponse.
- Je vous remercie beaucoup pour votre aide, j'ai upvoted votre réponse. J'ai décidé d'utiliser les deux approches, utiliser les énumérations de type int, et l'utilisation d'un dictionnaire pour la recherche par chaîne.
- Je sais que c'est une vieille question, mais "ces valeurs ne sont pas jamais à changer, par exemple des Etats-unis" est un très puissant hypothèse. Qui est-à-dire les usa ne jamais gagner ou perdre des etats-unis? L'Alaska et d'Hawaii n'étaient pas des etats-unis jusqu'en 1959, moins il y a un siècle.
Vous devez vous connecter pour publier un commentaire.
Casting de
int
à un enum est très bon marché... ça va être plus rapide qu'une recherche dans le dictionnaire. En gros, c'est un no-op, juste de copier les bits dans un emplacement avec un autre notionnel type.De l'analyse d'une chaîne de caractères en une valeur d'enum sera un peu plus lente.
Je doute que cela va être un goulot d'étranglement pour vous mais vous le faites si, pour être honnête... sans en savoir plus sur ce que vous faites, c'est un peu dur à la recommandation au-delà de la normale "d'écrire le plus simple, le mode lisible et maintenable code qui fonctionne, puis vérifier qu'il remplit assez bien".
int
valeurs tout aussi bon marché que le(int)
cast?Vous n'allez pas à remarquer une grande différence de performance entre les deux, mais je voudrais encore vous recommandons d'utiliser un Dictionnaire, car il va vous donner un peu plus de souplesse dans l'avenir.
Pour une chose, un Enum en C# on ne peut pas automatiquement associée à une classe comme en Java, donc si vous voulez associer des informations supplémentaires avec un état (Nom, prénom, Ville Capitale, abréviation Postale, etc.), la création d'un
UnitedState
classe sera plus facile de les regrouper toutes ces informations dans une seule collection.Aussi, même si vous pense cette valeur ne changera jamais, il n'est pas parfaitement immuable. Vous pourrait avoir une nouvelle obligation d'inclure les Territoires, par exemple. Ou peut-être vous aurez besoin pour permettre aux utilisateurs de voir les noms des Provinces Canadiennes, à la place. Si vous traiter de cette collection, comme toute autre collecte de données (à l'aide d'un référentiel pour récupérer des valeurs de), vous permettra d'avoir plus tard la possibilité de changer votre référentiel de mise en œuvre pour extraire des valeurs à partir d'une autre source de données (Base de données, Web Services, Session, etc.). Les énumérations sont beaucoup moins polyvalent.
Modifier
Concernant les performances argument: Gardez à l'esprit que vous n'êtes pas juste casting d'un Enum pour un int: vous êtes également en cours d'exécution ToString() sur ce enum, ce qui ajoute beaucoup de temps de traitement. Envisager le test suivant:
Résultats:
Donc, si la performance est vraiment votre préoccupation principale, un Dictionnaire est certainement le chemin à parcourir. Cependant, nous allons parler de ces fast times ici qu'il y a une demi-douzaine d'autres préoccupations que j'avais l'adresse avant et je dirais même des soins à propos de la question de vitesse.
Enum en C# n'ont pas été conçus pour fournir des mappages entre les valeurs et les chaînes de caractères. Ils ont été conçus pour fournir fortement typées valeurs des constantes que vous pouvez passer dans le code. Les deux principaux avantages sont:
Contrairement à Java, C# ne pas vérifier automatiquement les valeurs exprimées pour s'assurer qu'ils sont valides (
myState = (States)321
), de sorte que vous n'obtenez pas de données d'exécution de contrôles sur les entrées sans le faire manuellement. Si vous n'avez pas de code qui fait référence aux etats explicitement ("les Etats.L'Oklahoma"), alors vous ne pouvez pas obtenir n'importe quelle valeur de n ° 2 ci-dessus. Cela nous laisse avec #1 comme la seule vraie raison pour utiliser les énumérations. Si c'est une assez bonne raison pour vous, alors je vous suggérons d'utiliser les énumérations au lieu d'entiers vos valeurs. Ensuite, lorsque vous avez besoin d'une chaîne ou d'autres valeurs liées à l'état, effectuer une recherche dans le Dictionnaire.Voici comment je ferais:
De cette façon:
Enum.ToString()
.[grunt]
Vous pouvez utiliser TypeSafeEnum s
Voici une classe de base
Et voici un Enum :
Et il devient plus facile d'ajouter de l'Internationalisation.
Désolé pour le fait qu'il soit en VB et en français si.
Cheers !
Enums va grandement surpasser presque n'importe quoi, surtout du dictionnaire. Les Enums utiliser uniquement sur un seul octet. Mais pourquoi voudriez-vous être de casting? Semble que vous devriez être en utilisant les enums partout.
int
, sauf si vous déclarez explicitement le contraire.Alternativement, vous pouvez utiliser les constantes
Éviter l'énumération que vous pouvez: enums doit être remplacé singletons dérivant de la classe de base ou de la mise en œuvre d'une interface.
La pratique de l'utilisation d'enum vient d'un vieux style de programmation de C.
Vous commencez à utiliser un enum pour les États-unis, alors vous aurez besoin de connaître le nombre d'habitants, le capitole..., et vous aurez besoin d'un grand nombre de commutateurs à cette infos.