6 votes

Pourquoi pas d'enums non-intégraux ?

Pourquoi ne peut-on pas créer des enums non intégraux ? Je veux savoir si c'est est une décision de conception du langage, ou s'il y a des problèmes pour implémenter ceci dans le compilateur.

En d'autres termes, est-il possible d'implémenter des enums non intégrés dans le langage, mais il n'y a tout simplement pas de besoin justifié ? Ou si ce n'est pas faisable mais que c'est justifiable, quels sont les obstacles qui s'y opposent ?

Que quelqu'un m'explique la raison pour laquelle cette fonction n'est pas disponible en C#, s'il vous plaît.

9voto

jalf Points 142628

Il n'y a pas de raison technique pour laquelle cela ne pourrait pas être fait, mais alors, nous parlons plutôt d'un ensemble de constantes (peut-être dans un espace de noms commun, si elles sont liées).

Dans un enum, la valeur numérique est généralement secondaire.

Dans la suite :

enum Fruit {
  Apple,
  Orange,
  Pear,
  Peach
}

nous ne faisons que décrire un ensemble de constantes nommées. Nous disons qu'une variable de type Fruit peut prendre l'une de ces quatre valeurs. La valeur entière de chacune d'entre elles n'est pas vraiment pertinente. Tant que je ne les désigne que par leur nom, il importe peu que la valeur représentant Pomme soit 0, 1, 32, -53 ou 0,002534f.

La plupart des langages vous permettent de spécifier la valeur qui doit représenter chacun d'eux, mais c'est vraiment secondaire. C'est parfois utile, mais cela ne fait pas partie de l'objectif principal des enums. Ils sont simplement là pour vous donner un ensemble de constantes nommées apparentées sans avoir à spécifier un ID entier pour chacune.

De plus, les enums sont souvent utilisés pour spécifier des drapeaux optionnels qui peuvent être combinés avec des opérations binaires. Cela est trivial à mettre en œuvre si chaque valeur est représentée par un nombre entier (il suffit alors de choisir un nombre entier qui utilise le modèle de bits que vous voulez). Les valeurs en virgule flottante ne seraient pas utiles dans ce contexte. (les opérations bit à bit et/ou les opérations n'ont pas beaucoup de sens sur les valeurs en virgule flottante).

7voto

Jon Limjap Points 46429

Je pense que les enums ont été créés de cette façon parce que, contrairement à ce que vous voulez faire, Les énumérations ne sont pas censées contenir une représentation numérique significative. .

Par exemple, les enums sont parfaits pour décrire les ff :

enum Color
{
   Black,
   White,
   Red,
   Yellow,
   Blue,
   //everything else in between
}

(il est vrai que la couleur peut être représentée numériquement par des types complexes, mais permettez-moi de le faire pour le moment). Et l'humeur ?

enum Mood
{
    Happy,
    Giddy,
    Angry,
    Depressed,
    Sad
}

ou le goût ?

enum Taste
{
    Bitter,
    Salty,
    Sweet,
    Spicy
}

Je pense que vous avez compris. En résumé, les énumérations sont destinées à représenter des objets ou des caractéristiques d'objets qui sont difficiles à représenter numériquement, ou qui n'ont pas de représentations numériques significatives ou pratiques -- et donc l'affectation arbitraire à un entier qui est le type de données le plus pratique pour cela.

Par opposition à des choses comme les vacances, qui sont numériquement significatif .

4voto

paxdiablo Points 341644

Seuls les concepteurs du langage peuvent vous dire pourquoi ils n'ont pas autorisé les énumérations non intégrales, mais je peux vous donner l'explication la plus probable.

Le C original ne le faisait pas parce que ce n'était pas nécessaire pour ses objectifs (un langage de programmation de systèmes). Le C++ ne l'a pas fait puisqu'il était basé sur le C et que vous pouviez l'émuler avec des classes de toute façon. Le C# ne le fait probablement pas pour les mêmes raisons.

Ce n'est qu'une supposition de ma part, car je n'ai pas participé à la conception de ces langages.

Une fois que vous avez décidé de suivre la voie des classes (DateTime), il n'y a guère de raison de ne pas aller jusqu'au bout. Si vous voulez utiliser des enums, vous pouvez les créer sous forme d'entiers séquentiels commençant par zéro et avoir un tableau de valeurs DateTime utilisant ces enums comme index.

Mais je me contenterais d'avoir une classe Holiday qui fournirait tout le kit et tout le bazar dans la classe : les constantes, la routine get() pour renvoyer un DateTime sur la base de ces constantes et ainsi de suite.

Cela vous donne une véritable encapsulation et la possibilité de changer totalement l'implémentation sans affecter l'interface. Pourquoi se débarrasser d'un des avantages de la POO ?

2voto

Damovisa Points 6756

Sans connaître la réponse réelle, je dirais que c'est plutôt la seconde solution - il n'y a pas de besoin réel justifié.

Dans mon esprit, les Enums sont simplement là pour représenter les différentes options disponibles dans un cas particulier, et non pour stocker des données.

Une variable contenant une valeur d'énumération ne doit pas être considérée comme contenant la valeur 1, 2 ou 3, même si ce sont les valeurs réelles stockées dans cet emplacement mémoire. Il faut plutôt penser qu'elle représente lundi, mardi ou mercredi (par exemple). Il n'a de sens que dans le cadre de cette énumération et ne devrait pas (bien que ce soit souvent le cas) être utilisé d'une autre manière. Les opérations que vous effectuez sur les valeurs des Enums sont simplement des raccourcis de programmation rendus disponibles par la manière dont les Enums ont été implémentées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X