Sollten Enums in C # eine eigene Datei haben? [geschlossen]

178

Ich habe eine Klasse, die eine Aufzählung verwendet. Die Aufzählung befindet sich derzeit in einer eigenen Datei, was verschwenderisch erscheint.

Wie ist die allgemeine Meinung zu Aufzählungen, die im Namespace einer Datei platziert werden, in der sie verwendet werden? Oder sollte die Aufzählung wirklich in einer eigenen CS-Datei leben?

Bearbeiten

Ich sollte erwähnen, dass die betreffende Klasse diese Aufzählungen verwendet, aber auch externe Anrufer. Mit anderen Worten, eine andere Klasse kann diese Aufzählungen festlegen. Sie werden also nicht intern in der Klasse verwendet, sonst wäre diese Frage ein Kinderspiel.

Finglas
quelle
86
Wenn Sie magische Zahlen verwenden würden, hätten Sie dieses Problem überhaupt nicht.
MusiGenesis
7
Sollte dies ein Community-Wiki sein? Abgesehen von den IDE-Funktionen gibt es keine richtige Antwort und keine wirklichen technischen Überlegungen.
Jeff Sternal
1
Sie können sich immer noch im selben Namespace befinden, auch wenn sie sich in verschiedenen Dateien befinden. Wenn Sie die sekundäre Frage stellen, ob ein .Enums-Namespace UND eine neue Datei erstellt werden sollen, würde ich normalerweise Nein sagen. Aber sonst könnten Sie Ihr Verständnis von Namespaces falsch haben und sollten darüber lesen - (nicht viel für sie, nur ein Organisationsmechanismus)
Jason Kleban
1
Durch das Deklarieren der Aufzählung in einer eigenen Datei kann der Programmierer die Aufzählung mithilfe des Befehlsfensters (> von [Aufzählungsname]) leicht finden
Riju

Antworten:

103

Ich würde nicht "verschwenderisch" sagen (wie viel kostet eine zusätzliche Datei?), Aber es ist oft unpraktisch. Normalerweise gibt es eine Klasse, die am engsten mit der Aufzählung verbunden ist, und ich habe sie in dieselbe Datei eingefügt.

James Curran
quelle
7
Es fügt dem Verzeichnis beim Surfen Rauschen hinzu, das habe ich mit verschwenderisch gemeint.
Finglas
117
@Finglas - das Geräusch einer Person ist das Signal einer anderen Person!
Jeff Sternal
6
Normalerweise gibt es eine Klasse, die am engsten verbunden ist. Wenn sich dies jedoch ändert und sich jemand entscheidet, eine Abhängigkeit von der Aufzählung zu übernehmen, ist es Zeit für einen Refactor.
Brennan Pope
2
Wenn die Aufzählung für verschiedene Klassen freigegeben werden soll, ist es vorzuziehen, sie in einer separaten Datei abzulegen.
Konrad
76

Dies ist wirklich nur eine Frage der Präferenz.

Ich ziehe es vor, jede Aufzählung in eine eigene Datei zu stellen (ebenfalls für jede Schnittstelle, Klasse und Struktur, egal wie klein sie ist). Dies erleichtert das Auffinden, wenn ich von einer anderen Lösung komme oder auf andere Weise noch keinen Verweis auf den betreffenden Typ habe.

Das Einfügen eines einzelnen Typs in jede Datei erleichtert auch das Erkennen von Änderungen in Versionsverwaltungssystemen, ohne sich zu unterscheiden.

Jeff Sternal
quelle
10
"Das Einfügen eines einzelnen Typs in jede Datei erleichtert auch das Erkennen von Änderungen in Versionsverwaltungssystemen, ohne sich zu unterscheiden." Die Angst vor Unterschieden sollte nicht die Grundlage Ihrer Entwurfsentscheidungen bilden. Ich würde sogar argumentieren, dass jeder, der nicht weiß, wie man eine Datei in der Quellcodeverwaltung richtig unterscheidet, die Quellcodeverwaltung überhaupt nicht wirklich verwendet.
Dan Bechard
59

Dies ist eine Frage des Stils. Ich neige dazu, eine Datei Enums.csin der Lösung aufzurufen, in der die Enum-Deklarationen gesammelt werden.

Aber sie werden normalerweise F12trotzdem über den Schlüssel gefunden.

Fredrik Mörk
quelle
4
Ich denke, dies ist wahrscheinlich die beste Option, da es: 1) nur eine Datei anstelle von vielen ist, was als überladen des Verzeichnisses angesehen werden könnte. 2) klar ist, was in der Datei enthalten ist. 3) bedeutet, dass Sie wissen, wo Sie eine enumstatt finden können Es befindet sich in einer Datei, die eine Klasse enthält, die verwandt ist, aber nicht unbedingt die einzige Klasse, die sie verwendet
dav_i
6
Das gefällt mir absolut nicht. Wie in der Antwort von James Curran gesagt, beziehen sich Aufzählungen hauptsächlich auf Klassen. Wenn Sie sie alle in einer globalen Datei ablegen, befinden sie sich nicht einmal mehr in einem Verzeichnis (für einen Sub-Namespace), zu dem sie thematisch gehören könnten.
Ray
3
Ja @DebugErr, ich stimme dir zu. Seit diese Antwort im Jahr 2010 veröffentlicht wurde, habe ich zwischen verschiedenen Ansätzen gewechselt und tendiere dazu, eine Datei pro Typ zu verwenden oder Aufzählungen in derselben Datei wie die zugehörige Klasse zu deklarieren.
Fredrik Mörk
@ Ray ...enums have a relation to classes mostly.. Hier hast du mich verloren. Bitte geben Sie ein Beispiel dafür, wie Sie mit Aufzählungen umgehen würden, die Beziehungen zu mehreren Klassen haben.
K - Die Toxizität in SO nimmt zu.
@KarlMorrison Bitte, dieser Kommentar ist 5 Jahre alt. Wie auch immer, ich habe das Wort "meistens" aus einem bestimmten Grund hinzugefügt. Aufzählungen beziehen sich nicht nur auf Klassen, sondern auch auf Namespaces. Wenn ich eine AnchorStyleAufzählung in einer UI-Bibliothek verwenden würde, hätte ich normalerweise auch einen UI-Sub-Namespace und einen entsprechenden Ordner. Ich würde es dann in einer AnchorStyle.csDatei im UI-Ordner ablegen, wo ich es leicht finden kann, nicht in einer generisch benannten "Enums.cs" -Datei.
Ray
47

Die Frage, die Sie sich stellen sollten, lautet: Gibt es irgendetwas an einem Aufzählungstyp in C #, das angibt, dass ich ihn anders behandeln sollte als alle anderen von mir erstellten Typen?

Wenn die Aufzählung öffentlich ist, sollte sie wie jeder andere öffentliche Typ behandelt werden. Wenn es privat ist, deklarieren Sie es als verschachteltes Mitglied der Klasse, die es verwendet. Es gibt keinen zwingenden Grund, zwei öffentliche Typen in dieselbe Datei aufzunehmen, nur weil einer eine Aufzählung ist. Die Tatsache, dass es sich um einen öffentlichen Typ handelt, ist alles, was zählt; der Geschmack des Typs nicht.

Bryan Watts
quelle
Was ist, wenn Sie Enums in einer anderen Lösung desselben Unternehmensprojekts wiederverwenden möchten? Das Binden von Enums mit Klassen, die es verwenden, wäre sehr schwierig, es wiederzuverwenden.
Mko
@mko: Die Projektreferenz bedeutet bereits, dass sowohl die Klasse als auch die Aufzählung für die unterschiedliche Lösung verfügbar sind. Was würde es schwierig machen?
Bryan Watts
Sicher, aber möchten Sie wirklich die gesamte Klasse mit ihrer Logik teilen, wenn Sie nur Aufzählungen verwenden möchten? Was ist, wenn verschiedene Klassen dieselbe Aufzählung haben? Wo würdest du es platzieren?
Mko
@mko: Mit einer Projektreferenz erhalten Sie beide Typen, unabhängig davon, ob sie sich in unterschiedlichen Dateien befinden oder nicht. Ich habe Probleme herauszufinden, was Sie fragen.
Bryan Watts
Nun, ich spreche nicht über Projektreferenzen, das sind Sie. Ich spreche über das Verschieben von Aufzählungen in eine freigegebene Projektdatei und die Möglichkeit, sie in mehreren Projekten wiederzuverwenden, ohne ganze Klassen verfügbar zu machen. Sie sagen: "Es gibt keinen zwingenden Grund, zwei öffentliche Typen in dieselbe Datei aufzunehmen, nur weil einer eine Aufzählung ist." Vielleicht gibt es einen Grund, alle Aufzählungen in dieselbe Datei zu setzen, wenn Sie meiner Erklärung folgen.
mko
24

Ein weiterer Vorteil des Einfügens jedes Typs (Klasse, Struktur, Aufzählung) in eine eigene Datei ist die Quellcodeverwaltung. Sie können leicht den gesamten Verlauf des Typs abrufen.

Tommy Carlier
quelle
18

Ich platziere meistens innerhalb des Namespace und außerhalb der Klasse, damit andere Klassen in diesem Namespace wie unten leicht darauf zugreifen können.

namespace UserManagement
{
    public enum UserStatus { Active, InActive }
    class User
    {
        ...
    }
}
Adeel
quelle
Beeindruckend. Ich habe nicht gewusst, dass Aufzählungen direkt in den Namespace eingefügt werden können. Ich gehe mit dieser Antwort. In meiner MVC-Struktur werden sie in der Steuerung platziert, was für mich logisch ist. Danke dafür. Upvoted.
C4d
11

Im Allgemeinen bevorzuge ich, dass sich meine Aufzählungen in derselben Datei wie die Klasse befinden, von der es höchstwahrscheinlich ein Attribut sein wird. Wenn ich zum Beispiel eine Klasse habe, befindet sich Taskdie Aufzählung TaskStatusin derselben Datei.

Wenn ich jedoch allgemeinere Aufzählungen habe, behalte ich sie kontextbezogen in verschiedenen Dateien.

Nikos Steiakakis
quelle
Was ist, wenn verschiedene Klassen auch dieselbe Aufzählung verwenden?
Mko
2
@mko - Deshalb habe ich gesagt (im Jahr 2010, als ich darauf antwortete), dass Enums, wenn sie allgemeiner Natur sind, in separaten Dateien gespeichert werden. Mit kontextbezogen meinte ich, dass sich einige Aufzählungen in einigen Fällen in einer separaten Datei befinden könnten, und in anderen Fällen könnte ich eine Reihe von Aufzählungsdeklarationen in einer einzigen Datei gruppieren.
Nikos Steiakakis
10

Dies hängt davon ab, welcher Zugriff benötigt wird.

Wenn die Aufzählung nur von einer einzelnen Klasse verwendet wird, ist es in Ordnung, sie innerhalb dieser Klasse zu deklarieren, da Sie sie nirgendwo anders verwenden müssen.

Bei Aufzählungen, die von mehreren Klassen oder in einer öffentlichen API verwendet werden, behalte ich die Definition immer in einer eigenen Datei im entsprechenden Namespace. Es ist viel einfacher, diesen Weg zu finden, und die Strategie folgt dem Muster eines Objekts pro Datei, das auch für Klassen und Schnittstellen gut geeignet ist.

Jon Seigel
quelle
8

Ich denke, das hängt vom Umfang der Aufzählung ab. Wenn die Aufzählung beispielsweise für eine Klasse spezifisch ist, beispielsweise um das Szenario der magischen Konstante zu vermeiden, würde ich sagen, dass sie in dieselbe Datei wie die Klasse eingefügt wird:

enum SearchType { Forward, Reverse }

Wenn die Aufzählung allgemein ist und von mehreren Klassen für verschiedene Szenarien verwendet werden kann, würde ich sie gerne in eine eigene Datei einfügen. Zum Beispiel könnte das Folgende für verschiedene Zwecke verwendet werden:

enum Result { Success, Error }
Vishal Mistry
quelle
6

Ich neige dazu, Enums aus einem sehr einfachen Grund in ihre eigene Datei einzufügen: Wie bei Klassen und Strukturen ist es schön zu wissen , wo genau gesucht werden muss, wenn Sie die Definition eines Typs finden möchten: in der gleichnamigen Datei. (Um fair zu sein, können Sie in VS auch immer "Gehe zur Definition" verwenden.)

Offensichtlich kann es außer Kontrolle geraten. Ein Kollege, bei dem ich arbeite, erstellt sogar separate Dateien für Delegierte.

Dan Tao
quelle
6

Ein Vorteil der Verwendung einer separaten Datei für Aufzählungen besteht darin, dass Sie die ursprüngliche Klasse, die die Aufzählung verwendet hat, löschen und mithilfe der Aufzählung eine neue Klasse schreiben können.

Wenn die Aufzählung unabhängig von der ursprünglichen Klasse ist, erleichtert das Ablegen in einer separaten Datei zukünftige Änderungen.

Doug Ferguson
quelle
6

Wenn Sie das USysWare-Dateibrowser-Add-In für Visual Studio verwenden, können Sie Dateien mit bestimmten Namen in Ihrer Lösung sehr schnell finden. Stellen Sie sich vor, Sie suchen nach einer Aufzählung, die nicht in einer eigenen Datei enthalten ist, sondern in einer Datei in einer gigantischen Lösung vergraben ist.

Für kleine Lösungen spielt es keine Rolle, aber für große wird es umso wichtiger, Klassen und Aufzählungen in ihren eigenen Dateien zu behalten. Sie können sie schnell finden, bearbeiten und vieles mehr. Ich empfehle dringend, Ihre Aufzählung in eine eigene Datei zu stellen.

Und wie gesagt ... Wie verschwenderisch ist eine Datei, die sowieso nur ein paar KB groß ist?

Batalla
quelle
Ich benutze dieses Add-In auch, es ist ziemlich praktisch. Ich würde Enums in ihre eigene Datei einfügen, egal ob die Lösung groß oder klein ist.
Rui Jarimba
5

Sehr einfach großer Vorteil, Datei zu trennen. Wenn sich ein Objekt in einer eigenen MyObjectName.cs-Datei befindet, können Sie zum Lösungs-Explorer gehen und MyObjectName.cs eingeben und genau 1 Datei anzeigen. Alles, was das Debuggen besser macht, ist schön.

Ein weiterer Vorteil in ähnlicher Weise: Wenn Sie alle Dateien ( ctrl+ shft+ F) nach einem Namen durchsuchen , finden Sie möglicherweise 20 Verweise auf den Namen in derselben Datei ... und dieser gefundene Name ist Teil verschiedener Objekte. Im Fenster Ergebnisse suchen sehen Sie nur die Zeilennummer und den Dateinamen. Sie müssten die Datei öffnen und einen Bildlauf durchführen, um herauszufinden, in welchem ​​Objekt sich die gefundene Referenz befindet.

Alles, was das Debuggen erleichtert, gefällt mir.

vbp13
quelle
2

Wenn Sie mehrere Projekte in einer Lösung haben. Dann erstellen Sie besser ein anderes Projekt Utilities. Erstellen Sie dann einen Ordner \Enumerationsund erstellen Sie einen verschachtelten static class. Weisen Sie dann jeder statischen Klasse zu, in der Sie eine Aufzählung erstellen, die dem Namen Ihrer Projekte entspricht. Wenn Sie beispielsweise ein Projekt mit dem Namen DatabaseReader und DatabaseUsers haben, können Sie die statische Klasse wie folgt benennen

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

}

Dann wird die gesamte Aufzählung deklariert, die in den gesamten Lösungen pro Projekt verwendet werden kann. Verwenden Sie # region, um jedes Problem zu trennen. Auf diese Weise ist es einfacher, nach Aufzählungen zu suchen

Israel Ocbina
quelle
1

Ich möchte eine öffentliche Aufzählungsdatei mit dem Namen E haben, die jede separate Aufzählung enthält. Dann kann auf jede Aufzählung mit E zugegriffen werden ... und sie befinden sich an einem Ort, an dem sie verwaltet werden können.

Patrick Kafka
quelle