Les énumérations en C # doivent-elles avoir leur propre fichier? [fermé]

180

J'ai une classe qui utilise une énumération, l'énumération est actuellement dans son propre fichier, ce qui semble inutile.

Quelle est l'opinion générale sur les énumérations placées dans l'espace de noms d'un fichier dans lequel elles sont consommées? Ou l'énumération devrait-elle vraiment vivre dans son propre fichier cs?

Éditer

Je dois mentionner que si la classe en question utilise ces énumérations, il en va de même pour les appelants externes. En d'autres termes, une autre classe peut définir ces énumérations. Donc, ils ne sont pas utilisés en interne à la classe, sinon cette question serait une évidence.

Finglas
la source
88
Si vous utilisiez des nombres magiques, vous n'auriez pas du tout ce problème.
MusiGenesis
7
Cela devrait-il être un wiki communautaire? Il n'y a pas de réponse correcte et pas de véritables considérations techniques en dehors des capacités IDE.
Jeff Sternal
1
Ils peuvent toujours être dans le même espace de noms même s'ils sont dans des fichiers différents. Si vous posez la question secondaire de savoir s'il faut créer un espace de noms .Enums ET un nouveau fichier, alors je dirais, généralement, non. Mais sinon, vous pourriez avoir une mauvaise compréhension des espaces de noms et devriez lire à leur sujet - (pas grand chose pour eux, juste un mécanisme d'organisation)
Jason Kleban
1
Déclarer enum dans son propre fichier permet au programmeur de localiser facilement enum en utilisant la fenêtre de commande (> de [enum Name])
Riju

Réponses:

104

Je ne dirais pas «gaspillage» (combien coûte un fichier supplémentaire?), Mais c'est souvent gênant. Habituellement, il y a une classe qui est la plus étroitement associée à l'énumération, et je les mets dans le même fichier.

James Curran
la source
7
Cela ajoute du bruit au répertoire lors de la navigation, c'est ce que j'entendais par gaspillage.
Finglas
119
@Finglas - le bruit d'une personne est le signal d'une autre personne!
Jeff Sternal
6
Il existe généralement une classe qui est la plus étroitement associée. Mais si cela change, si quelqu'un arrive à la fois décide de prendre une dépendance sur l'énumération, alors il est temps pour un refactor.
Brennan Pope
2
Si l'énumération doit être partagée entre différentes classes, il est préférable de la placer dans un fichier séparé.
Konrad
76

C'est vraiment juste une question de préférence.

Je préfère mettre chaque énumération dans son propre fichier (de même pour chaque interface, classe et structure, aussi petite soit-elle). Cela les rend plus faciles à trouver lorsque je viens d'une autre solution ou que je n'ai pas déjà de référence au type en question.

Le fait de placer un seul type dans chaque fichier facilite également l'identification des changements dans les systèmes de contrôle de source sans faire de différence.

Jeff Sternal
la source
10
"Mettre un seul type dans chaque fichier facilite également l'identification des changements dans les systèmes de contrôle de source sans faire de différence." La peur de différer ne doit pas constituer le fondement de vos décisions de conception. Je dirais même que quiconque ne sait pas comment différencier correctement un fichier dans le contrôle de code source n'utilise pas du tout le contrôle de code source.
Dan Bechard
59

C'est entièrement une question de style. Ce que j'ai tendance à faire est d'avoir un fichier appelé Enums.csdans la solution dans lequel les déclarations d'énumération sont collectées.

Mais ils se trouvent généralement à travers la F12clé de toute façon.

Fredrik Mörk
la source
4
Je pense que c'est probablement la meilleure option car: 1) est un seul fichier au lieu de plusieurs qui pourraient être considérés comme encombrant le répertoire 2) est clair ce qui est contenu dans le fichier 3) signifie que vous savez où trouver un enumau lieu de il se trouve dans un fichier contenant une classe qui est liée mais pas nécessairement la seule classe qui l'utilise
dav_i
6
Je n'aime absolument pas ça. Comme dit dans la réponse de James Curran, les énumérations ont principalement une relation avec les classes. Lorsque vous les mettez tous dans un fichier global, ils ne sont même plus dans un répertoire (pour un sous-espace de noms) auquel ils pourraient appartenir thématiquement.
Ray
3
Oui @DebugErr, je suis d'accord avec vous. Depuis que cette réponse a été publiée en 2010, j'ai changé entre différentes approches et j'ai tendance à utiliser un fichier par type, ou à déclarer des énumérations dans le même fichier que la classe associée.
Fredrik Mörk
@ Ray ...enums have a relation to classes mostly.. C'est là que tu m'as perdu. Veuillez donner un exemple de la façon dont vous géreriez les énumérations qui ont des relations avec plusieurs classes?
basickarl
@KarlMorrison S'il vous plaît, ce commentaire a 5 ans. Quoi qu'il en soit, j'ai ajouté le mot «surtout» pour une raison. Les énumérations ont une relation avec plus que de simples classes, comme les espaces de noms aussi. Si j'avais une AnchorStyleénumération utilisée dans une bibliothèque d'interface utilisateur, j'aurais généralement également un sous-espace de noms d'interface utilisateur et un dossier correspondant. Je le placerais ensuite dans un AnchorStyle.csfichier dans le dossier UI où je peux facilement le trouver, pas dans un fichier "Enums.cs" nommé génériquement.
Ray
47

La question à se poser serait: y a-t-il quelque chose à propos d'un type d'énumération en C # qui indique que je devrais le traiter différemment de tous les autres types que je crée?

Si l'énumération est publique, elle doit être traitée comme tout autre type public. S'il est privé, déclarez-le comme membre imbriqué de la classe qui l'utilise. Il n'y a aucune raison impérieuse de placer deux types publics dans le même fichier simplement parce que l'un est une énumération. Le fait que ce soit un type public est tout ce qui compte; la saveur du type ne l'est pas.

Bryan Watts
la source
Et si vous souhaitez réutiliser des énumérations dans une solution différente du même projet d'entreprise? Lier les énumérations avec la classe l'utilisant serait très difficile à réutiliser.
mko
@mko: La référence du projet signifie déjà que la classe et l'énumération seront disponibles pour la solution différente. Qu'est-ce qui rendrait la tâche difficile?
Bryan Watts
Bien sûr, mais voulez-vous vraiment partager une classe entière avec sa logique si vous ne voulez utiliser que des énumérations. De plus, que se passe-t-il si des classes différentes partagent la même énumération. Où le placeriez-vous?
mko
@mko: Avec une référence de projet, vous obtiendrez les deux types, qu'ils soient dans des fichiers différents ou non. J'ai du mal à comprendre ce que vous demandez.
Bryan Watts
Eh bien, je ne parle pas de référence de projet, vous l'êtes. Je parle de déplacer les énumérations vers un fichier de projet partagé et de pouvoir le réutiliser dans plusieurs projets sans exposer des classes entières. Vous dites: "Il n'y a aucune raison impérieuse de mettre deux types publics dans le même fichier simplement parce que l'un est une énumération". Il y a peut-être une raison de mettre toutes les énumérations dans le même fichier si vous suivez mon explication.
mko
24

Un autre avantage de placer chaque type (class, struct, enum) dans son propre fichier est le contrôle de code source. Vous pouvez facilement obtenir l'historique complet du type.

Tommy Carlier
la source
18

Je place principalement à l'intérieur dans l'espace de noms et à l'extérieur de la classe afin qu'il soit facilement accessible aux autres classes dans cet espace de noms comme ci-dessous.

namespace UserManagement
{
    public enum UserStatus { Active, InActive }
    class User
    {
        ...
    }
}
Adeel
la source
Sensationnel. Je n'ai pas connu d'énumérations qui peuvent être placées directement dans l'espace de noms. Je vais avec cette réponse. À l'intérieur de ma structure MVC, ils seront placés à l'intérieur du contrôleur, ce qui me rend logique. Merci pour cela. J'ai voté pour.
C4d
11

En général, je préfère que mes énumérations soient dans le même fichier que la classe dont ce sera probablement un attribut. Si par exemple j'ai une classe Taskalors l'énumération TaskStatussera dans le même fichier.

Cependant, si j'ai des énumérations de nature plus générique, je les garde contextuellement dans divers fichiers.

Nikos Steiakakis
la source
Et si une classe différente utilise également la même énumération?
mko
2
@mko - C'est pourquoi j'ai dit (en 2010 quand j'ai répondu à cela) que si les énumérations ont une nature plus générique, je les garde dans des fichiers séparés. Par contexte, je voulais dire que dans certains cas, certaines énumérations pourraient être dans un fichier séparé, et dans d'autres cas, je pourrais regrouper un ensemble de déclarations d'énumérations dans un seul fichier.
Nikos Steiakakis
10

Cela dépend de l'accès nécessaire.

Si l'énumération n'est utilisée que par une seule classe, vous pouvez la déclarer dans cette classe car vous n'avez pas besoin de l'utiliser ailleurs.

Pour les énumérations utilisées par plusieurs classes ou dans une API publique, je conserverai toujours la définition dans son propre fichier dans l'espace de noms approprié. C'est beaucoup plus facile à trouver de cette façon, et la stratégie suit le modèle d'un objet par fichier, ce qui est également bon à utiliser avec les classes et les interfaces.

Jon Seigel
la source
8

Je pense que cela dépend de la portée de l'énumération. Par exemple, si l'énumération est spécifique à une classe, par exemple utilisée pour éviter le scénario de constante magique, alors je dirais de la mettre dans le même fichier que la classe:

enum SearchType { Forward, Reverse }

Si l'énumération est générale et peut être utilisée par plusieurs classes pour différents scénarios, alors je serais enclin à l'utiliser dans son propre fichier. Par exemple, ce qui suit pourrait être utilisé à plusieurs fins:

enum Result { Success, Error }
Vishal Mistry
la source
6

J'ai tendance à mettre enums dans leur propre fichier pour une raison très simple: comme pour les classes et les structs, c'est bien de savoir exactement où chercher si vous voulez trouver la définition d'un type: dans le fichier du même nom. (Pour être honnête, dans VS, vous pouvez toujours utiliser "Aller à la définition".)

Évidemment, cela peut devenir incontrôlable. Un collègue où je travaille crée même des fichiers séparés pour les délégués.

Dan Tao
la source
6

L'un des avantages de l'utilisation d'un fichier séparé pour les énumérations est que vous pouvez supprimer la classe d'origine qui a utilisé l'énumération et écrire une nouvelle classe à l'aide de l'énumération.

Si l'énumération est indépendante de la classe d'origine, la placer dans un fichier séparé facilite les modifications futures.

Doug Ferguson
la source
6

Si vous utilisez le complément du navigateur de fichiers USysWare pour Visual Studio, vous pouvez trouver très rapidement des fichiers de noms particuliers dans votre solution. Imaginez que vous cherchiez une énumération qui ne soit pas dans son propre fichier mais plutôt enterrée dans un fichier dans une solution gigantesque.

Pour les petites solutions, cela n'a pas d'importance, mais pour les grandes, il devient d'autant plus important de conserver les classes et les énumérations dans leurs propres fichiers. Vous pouvez les trouver rapidement, les modifier, etc. Je recommande vivement de mettre votre enum dans son propre fichier.

Et comme cela a été dit ... Quel gaspillage est un fichier qui ne fait que quelques Ko de toute façon?

Bataille
la source
J'utilise aussi ce complément, c'est assez pratique. Je mettrais les énumérations dans leur propre fichier, peu importe si la solution est grande ou petite.
Rui Jarimba
5

Très simple avantage énorme pour séparer le fichier. Lorsqu'un objet est dans son propre fichier MyObjectName.cs ... vous pouvez accéder à l'explorateur de solutions et taper MyObjectName.cs et afficher exactement 1 fichier. Tout ce qui améliore le débogage est bien.

Autre avantage sur une note similaire, si vous recherchez tous les fichiers ( ctrl+ shft+ F) pour un nom, vous pouvez trouver 20 références au nom dans le même fichier ... et ce nom trouvé fera partie d'objets différents. Dans la fenêtre Résultats de la recherche, tout ce que vous pouvez voir est le numéro de ligne et le nom du fichier. Vous devrez ouvrir le fichier et faire défiler pour déterminer dans quel objet se trouvait la référence trouvée.

Tout ce qui facilite le débogage, j'aime.

vbp13
la source
3

Si vous avez plusieurs projets dans une seule solution. Alors mieux vaut créer un autre projet Utilities. Ensuite, créez un dossier \Enumerationset créez un fichier imbriqué static class. Et puis attribuez chaque classe statique où vous allez créer une énumération qui correspond au nom de vos projets. Par exemple, vous avez un projet nommé DatabaseReader et DatabaseUsers, vous pouvez nommer la classe statique comme

public static class EnumUtility {
    #region --Database Readers Enum
    public static class EnumDBReader {
         public enum Actions { Create, Retrieve, Update, Delete}; 
    }
    #endregion

    #region --Database Users Enum
    public static class EnumDBUsers {
         public enum UserIdentity { user, admin }; 
    }
    #endregion

}

Ensuite, toute l'énumération qui peut être utilisée dans l'ensemble des solutions par projets sera déclarée dessus. Utilisez # regionpour séparer chaque préoccupation. Grâce à cela, il est plus facile de rechercher des énumérations

Israël Ocbina
la source
1

J'aime avoir un fichier d'énumérations public nommé E contenant chaque énumération séparée, puis toute énumération peut être accédée avec E ... et ils sont dans un seul endroit à gérer.

Patrick Kafka
la source