Je me demandais si le type de structure Enum a une limite sur ses membres. J'ai cette très grande liste de "variables" que j'ai besoin de stocker à l'intérieur d'une énumération ou de constantes dans une classe, mais j'ai finalement décidé de les stocker dans une classe, cependant, je suis un peu curieux de la limite des membres d'un énumé (le cas échéant). p>
Alors, les énumes ont-elles une limite sur .NET? P>
4 Réponses :
En raison d'une limite du format de fichier PE, vous ne pouvez probablement pas dépasser environ 100 000 000 valeurs. Peut-être plus, peut-être moins, mais certainement pas un problème. P>
J'ai essayé une énumération avec 2.000.001 entrées - elle compilait. (Mais Visual Studio a été très instable ...)
Oui. Le nombre de membres avec des valeurs distinctes em> est limité par le type sous-jacent de Enum code> - par défaut, il s'agit de int32 code>, afin que vous puissiez obtenir ce nombre de Membres (2 ^ 32 - Je trouve difficile que vous atteignez cette limite), mais vous pouvez spécifier explicitement le type sous-jacent comme celui-ci: enum { A, B = A, C = A, ... }
Merci, je ne savais pas que vous pourriez déclarer le type sous-jacent d'une énumération.
du C # Spécification de la langue 3.0 , 1.10: p>
Format de stockage de type Enum et la gamme de valeurs possibles sont déterminé par son type sous-jacent. p> blockQuote>
Bien que je ne sois pas à 100% sûr, je n'attendrais pas que le compilateur Microsoft C # n'autorise que des valeurs énuméraires non négatives, donc si le type sous-jacent est un int32 (c'est, par défaut), je m'attendrais à environ 2 ^ 31 valeurs possibles , mais il s'agit d'un détail de mise en œuvre car il n'est pas spécifié. Si vous avez besoin de plus que cela, vous faites probablement quelque chose de mal. P>
Les nombres négatifs sont autorisés tant que vous ne spécifiez pas explicitement un type sous-jacent non signé: invalide = -1, aucun = 0, optiona = 1, ...
Vous pouvez utiliser théoriquement Int64 comme type de base dans l'énum et obtenir 2 ^ 63 entrées possibles. D'autres vous ont donné d'excellentes réponses à ce sujet.
Je pense qu'il y a une deuxième question implicite de L'une des plus grandes considérations serait une maintenabilité à long terme. Pensez-vous que la société changera jamais la liste des valeurs que vous utilisez? Si oui, vous devez-t-il être compatible avec la liste des listes précédentes? Comment un problème significatif pourrait-il être? En général, plus le nombre de membres dans une énorme est en corrélation d'une probabilité plus élevée, la liste devra être modifiée à une date future. P> Enums est idéal pour beaucoup de choses. Ils sont propres, rapides et simples à mettre en œuvre. Ils travaillent très bien avec IntelliSense et facilitent le travail du prochain programmeur, surtout si les noms sont clairs, concis et si nécessaire, bien documenté. P> Le problème est une énumération vient également avec des inconvénients. Ils peuvent être problématiques si elles devaient être modifiées, surtout si les classes qui les utilisent sont persistées au stockage. P> Dans la plupart des cas, les énumjets sont persistés au stockage de leurs valeurs sous-jacentes, non pas comme leurs noms amicaux. p> dans cet exemple la valeur Si un autre programmateur fait petit changement au système et ajoute de l'animal à l'énum comme ceci; p> toutes les données sortant du stockage montrera maintenant la la vie em> Politiques comme PET EM> Politiques. C'est une erreur extrêmement facile à faire et peut introduire des bugs difficiles à suivre. P> Le deuxième problème majeur avec Enums est que chaque changement des données vous obligera à reconstruire et à redéployer votre programme. Cela peut causer des degrés de douleur variables. Sur un serveur Web qui peut ne pas être un gros problème, mais s'il s'agit d'une application utilisée sur 5 000 systèmes de bureau, vous avez un coût totalement différent pour redéployer votre changement de liste mineure. P> Si votre liste est susceptible de changer Périodiquement, vous devriez vraiment envisager un système qui stocke cette liste sous une autre forme, probablement en dehors de votre code. Les bases de données ont été spécifiquement conçues pour ce scénario ou même un fichier de configuration simple pourraient être utilisés (pas la solution préférée). La planification intelligente pour les modifications peut réduire ou éviter les problèmes liés à la reconstruction et à la redéploiement de votre logiciel. P> Ce n'est pas une suggestion d'optimiser prématurément votre système pour la possibilité de changement, mais plus une suggestion de structurer le code de sorte qu'un changement probable à l'avenir ne crée pas de problème majeur. Différentes situations nécessiteront des décisions de différence. P> Voici mes règlements bruts em> pour l'utilisation d'énums; p> Espérons que cela s'est développé sur les réponses de manière utile. p> p> insuranceclass.life code> serait persisté comme un numéro 2. P>
insuranceclass.life code> à
déterminer comment les autres données d'une classe doivent être utilisées, mais je voudrais
ne pas faire la valeur sous-jacente de {pseudocode} insuranceclass.life = 653,00 $ code> et
Utilisez la valeur elle-même dans les calculs. Enums ne sont pas des constantes. En faisant
Cela crée une confusion. li>
Je suis juste curieux de ce que vous faites cela aurait besoin de tant de constantes de devoir poser cette question ...
Bien sûr, je n'utiliserai pas la limite de taille 2 ^ 32, mais j'ai besoin de beaucoup de "stockage". Nous développons une application liée à l'assurance, donc il y a beaucoup de variables qui doivent être là pour faire la note pour obtenir une prime et que vous pouvez imaginer que ce sont beaucoup (probablement 600 à 1 000)