11
votes

Les énumes ont-elles une limite de membres en C #?

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).

Alors, les énumes ont-elles une limite sur .NET?


2 commentaires

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)


4 Réponses :


7
votes

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.


1 commentaires

J'ai essayé une énumération avec 2.000.001 entrées - elle compilait. (Mais Visual Studio a été très instable ...)



19
votes

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, ... }


1 commentaires

Merci, je ne savais pas que vous pourriez déclarer le type sous-jacent d'une énumération.



6
votes

du C # Spécification de la langue 3.0 , 1.10:

Format de stockage de type Enum et la gamme de valeurs possibles sont déterminé par son type sous-jacent.

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.


1 commentaires

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, ...



3
votes

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 si vous utilisez une énorme pour quelque chose avec un grand nombre d'articles. Cela s'applique réellement directement à votre projet à bien des égards.

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.

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é.

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.

Dans la plupart des cas, les énumjets sont persistés au stockage de leurs valeurs sous-jacentes, non pas comme leurs noms amicaux. xxx

dans cet exemple la valeur insuranceclass.life serait persisté comme un numéro 2.

Si un autre programmateur fait petit changement au système et ajoute de l'animal à l'énum comme ceci; xxx

toutes les données sortant du stockage montrera maintenant la la vie Politiques comme PET Politiques. C'est une erreur extrêmement facile à faire et peut introduire des bugs difficiles à suivre.

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.

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.

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.

Voici mes règlements bruts pour l'utilisation d'énums;

  1. Utilisez-les pour classer et définir d'autres données, mais pas comme des données eux-mêmes. Pour être plus clair, j'utiliserais insuranceclass.life à 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 $ et Utilisez la valeur elle-même dans les calculs. Enums ne sont pas des constantes. En faisant Cela crée une confusion.
  2. Utilisez Enums lorsque la liste de l'énum est peu susceptible de changer. Enums sont super Pour les concepts fondamentaux mais pauvres pour changer constamment des idées. Lorsque vous créez une énumération, il s'agit d'un contrat avec l'avenir programmeurs que vous souhaitez éviter de casser.
  3. Si vous doit changer d'énumé, alors avez une règle que tout le monde suit que Vous ajoutez à la fin, pas au milieu. L'alternative est que vous Définissez des valeurs spécifiques à chaque énum et ne change jamais ceux-ci. Les point est que vous êtes peu probable de savoir comment les autres utilisent votre énumérations sous-jacentes aux valeurs et les modifier peut causer la misère pour quiconque sinon en utilisant votre code. C'est un ordre de grandeur plus important Pour tout système qui persiste les données.
  4. Le corollaire au n ° 2 et n ° 3 est de ne jamais supprimer un membre d'un énumé. Il existe des cercles spécifiques d'enfer pour les programmeurs qui le font dans une base de code utilisée par d'autres.

    Espérons que cela s'est développé sur les réponses de manière utile.


0 commentaires