Gli enum in C # dovrebbero avere il proprio file? [chiuso]


178

Ho una classe che utilizza un elenco, l'enum è attualmente nel suo file che sembra dispendioso.

Qual è l'opinione generale sulle enumerazioni inserite nello spazio dei nomi di un file in cui vengono consumate? O l'enum dovrebbe davvero vivere nel proprio file cs?

modificare

Devo dire che mentre la classe in questione utilizza queste enumerazioni, anche i chiamanti esterni. In altre parole, un'altra classe può impostare queste enumerazioni. Quindi non sono usati internamente alla classe, altrimenti questa domanda non avrebbe alcun problema.


86
Se avessi usato numeri magici, non avresti avuto questo problema.
MusiGenesis,

7
Questo dovrebbe essere wiki della comunità? Non esiste una risposta corretta e nessuna reale considerazione tecnica oltre alle funzionalità IDE.
Jeff Sternal,

1
Possono comunque trovarsi nello stesso spazio dei nomi anche se si trovano in file diversi. Se stai ponendo la domanda secondaria se creare uno spazio dei nomi .Enums E un nuovo file, direi di solito no. Ma per il resto, potresti avere la tua comprensione degli spazi dei nomi sbagliata e dovresti leggere su di essi - (non molto per loro, solo un meccanismo organizzativo)
Jason Kleban,

1
Dichiarare enum nel proprio file consente al programmatore di individuare facilmente enum usando la finestra di comando (> of [enum Name])
Riju,

Risposte:


103

Non direi "dispendioso" (quanto costa un file extra?), Ma spesso è inconcepente. Di solito c'è una classe che è più strettamente associata all'enum e le inserisco nello stesso file.


7
Aggiunge rumore alla directory durante la navigazione, questo è ciò che intendevo per spreco.
Finglas,

117
@Finglas: il rumore di una persona è il segnale di un'altra persona!
Jeff Sternal,

6
Di solito c'è una classe che è più strettamente associata. Ma se questo cambia, se qualcuno arriva alla volta decide di prendere una dipendenza dall'enum, allora è il momento di un refactor.
Brennan Pope,

2
Se l'enum deve essere condiviso tra classi diverse, è preferibile metterlo in un file separato.
Konrad,

76

Questa è davvero solo una questione di preferenza.

Preferisco mettere ogni enumerazione nel suo file (allo stesso modo per ogni interfaccia, classe e struttura, non importa quanto sia piccola). Li rende più facili da trovare quando vengo da un'altra soluzione o altrimenti non ho già un riferimento al tipo in questione.

Inserire un singolo tipo in ciascun file semplifica inoltre l'identificazione delle modifiche nei sistemi di controllo del codice sorgente senza differenze.


10
"L'inserimento di un singolo tipo in ciascun file semplifica anche l'identificazione delle modifiche nei sistemi di controllo del codice sorgente senza differenze." La paura di diffondere non dovrebbe costituire la base delle tue decisioni di progettazione. Direi persino che chiunque non sappia come diff correttamente un file nel controllo del codice sorgente non sta affatto usando il controllo del codice sorgente.
Dan Bechard,

59

Questa è interamente una questione di stile. Quello che tendo a fare è avere un file chiamato Enums.csnella soluzione in cui sono raccolte le dichiarazioni enum.

Ma in genere si trovano F12comunque tramite la chiave.


4
Penso che questa sia probabilmente l'opzione migliore in quanto: 1) è solo un file invece di molti che potrebbero essere considerati ingombranti nella directory 2) è chiaro ciò che è contenuto nel file 3) significa che sai dove trovare un enuminvece di essendo in un file contenente una classe che è correlata ma non necessariamente l'unica classe che la utilizza
dav_i

6
Non mi piace assolutamente questo. Come detto nella risposta di James Curran, gli enum hanno principalmente una relazione con le classi. Quando li mettono tutti in un file globale, non sono nemmeno più in una directory (per uno spazio dei nomi secondari) a cui potrebbero tematicamente appartenere.
Ray,

3
Sì @DebugErr, sono d'accordo con te. Da quando questa risposta è stata pubblicata nel 2010, sono cambiata tra vari approcci e tendo ad andare con un file per tipo, o dichiarando enumerazioni nello stesso file della classe correlata.
Fredrik Mörk,

@Ray ...enums have a relation to classes mostly.. Questo è dove mi hai perso. Per favore, fai un esempio di come gestiresti enum che hanno relazioni con diverse classi?
K - La tossicità in SO sta crescendo.

@KarlMorrison Per favore, quel commento ha 5 anni. Comunque, ho aggiunto la parola "principalmente" per un motivo. Gli enum hanno una relazione con qualcosa di più delle semplici classi, come gli spazi dei nomi. Se avessi un AnchorStyleenum utilizzato in una libreria UI, in genere avrei anche uno spazio dei nomi secondario UI e una cartella corrispondente. Lo posizionerei quindi in un AnchorStyle.csfile nella cartella UI dove posso facilmente trovarlo, non in un file "Enums.cs" genericamente chiamato.
Ray,

47

La domanda da porsi sarebbe: c'è qualcosa in un tipo di enumerazione in C # che indica che dovrei trattarlo in modo diverso da tutti gli altri tipi che creo?

Se l'enumerazione è pubblica, deve essere trattata come qualsiasi altro tipo pubblico. Se è privato, dichiaralo come membro nidificato della classe che lo utilizza. Non vi sono motivi validi per inserire due tipi pubblici nello stesso file semplicemente perché si tratta di un elenco. Il fatto che sia di tipo pubblico è tutto ciò che conta; il sapore del tipo no.


Che dire se si desidera riutilizzare gli enum in una diversa soluzione dello stesso progetto aziendale? Associare enum con la classe che lo usa sarebbe molto difficile riutilizzarlo.
mko,

@mko: il riferimento al progetto indica già che sia la classe che l'enum saranno disponibili per la diversa soluzione. Cosa lo renderebbe difficile?
Bryan Watts,

Certo, ma vuoi davvero condividere l'intera classe con la sua logica se vuoi usare solo enumerazioni. Inoltre, cosa succede se classi diverse condividono la stessa enumerazione. Dove lo posizioneresti?
mko,

@mko: con un riferimento al progetto, otterrai entrambi i tipi se si trovano in file diversi o meno. Ho problemi a capire cosa stai chiedendo.
Bryan Watts,

Beh, non sto parlando del riferimento al progetto, lo sei. Sto parlando di spostare enum in un file di progetto condiviso ed essere in grado di riutilizzarlo in più progetti senza esporre intere classi. Dici "Non c'è motivo convincente per inserire due tipi pubblici nello stesso file semplicemente perché uno è un elenco". Forse c'è un motivo per mettere tutti gli enumerati nello stesso file se segui la mia spiegazione.
mko,

24

Un altro vantaggio di mettere ogni tipo (classe, struct, enum) nel proprio file è il controllo del codice sorgente. Puoi facilmente ottenere l'intera cronologia del tipo.


18

Metto principalmente all'interno dello spazio dei nomi e al di fuori della classe in modo che sia facilmente accessibile altre classi nello spazio dei nomi come di seguito.

namespace UserManagement
{
    public enum UserStatus { Active, InActive }
    class User
    {
        ...
    }
}

Wow. Non ho conosciuto enumerazioni che possono essere inserite direttamente nello spazio dei nomi. Vado con questa risposta. All'interno della mia struttura MVC verranno inseriti nel controller ciò che mi rende logico. Grazie per questo. Upvoted.
C4d,

11

In genere preferisco che i miei enum siano nello stesso file della classe di cui molto probabilmente sarà un attributo. Se per esempio ho una classe, Taskallora l'enum TaskStatussarà nello stesso file.

Tuttavia, se ho enumerazioni di carattere più generico, le tengo contestualmente in vari file.


E se un'altra classe usa anche lo stesso enum?
mko,

2
@mko - Ecco perché ho detto (nel 2010 quando ho risposto a questo) che se gli enum hanno una natura più generica li conservo in file separati. Con contestuale intendevo dire che in alcuni casi alcuni enum potrebbero trovarsi in un file separato, e in altri casi, potrei raggruppare una serie di dichiarazioni enum in un singolo file.
Nikos Steiakakis,

10

Dipende dall'accesso necessario.

Se l'enum viene utilizzato solo da una singola classe, va bene dichiararlo all'interno di quella classe perché non è necessario utilizzarlo altrove.

Per gli enum usati da più classi o in un'API pubblica, manterrò sempre la definizione nel suo file nello spazio dei nomi appropriato. È molto più facile da trovare in quel modo, e la strategia segue il modello di un oggetto per file, che è buono da usare anche con classi e interfacce.


8

Penso che dipenda dall'ambito dell'enum. Ad esempio, se l'enum è specifico di una classe, ad esempio utilizzato per evitare lo scenario di costante magica, direi di inserirlo nello stesso file della classe:

enum SearchType { Forward, Reverse }

Se l'enum è generale e può essere utilizzato da più classi per diversi scenari, allora sarei propenso a usarlo inserendolo nel suo file. Ad esempio, il seguito potrebbe essere utilizzato per diversi scopi:

enum Result { Success, Error }

6

Tendo a mettere enumerazioni nel loro file per un motivo molto semplice: come per le classi e le strutture, è bello sapere esattamente dove cercare se si desidera trovare la definizione di un tipo: nel file con lo stesso nome. (Per essere onesti, in VS puoi sempre usare anche "Vai alla definizione").

Ovviamente, può sfuggire di mano. Un collega in cui lavoro crea persino file separati per i delegati.


6

Un vantaggio dell'utilizzo di un file separato per enum è che puoi eliminare la classe originale che ha usato l'enum e scrivere una nuova classe usando l'enum.

Se l'enum è indipendente dalla classe originale, metterlo in un file separato rende le modifiche future più facili.


6

Se si utilizza il componente aggiuntivo USysWare File Browser per Visual Studio, è possibile trovare molto rapidamente file con nomi particolari nella soluzione. Immagina di cercare un enum che non è nel suo stesso file ma invece è sepolto in un file in una soluzione gigantesca.

Per le soluzioni di piccole dimensioni, non importa, ma per quelle di grandi dimensioni, diventa ancora più importante mantenere classi ed enumerazioni nei propri file. Puoi trovarli rapidamente, modificarli e altro ancora. Consiglio vivamente di mettere la tua enum in un suo file.

E come è stato affermato ... Quanto è inutile un file che finisce per essere solo un paio di kb?


Uso anche quel componente aggiuntivo, è abbastanza utile. Metterei enum nel loro file, non importa se la soluzione è grande o piccola.
Rui Jarimba,

5

Vantaggio molto semplice per separare il file. Quando un oggetto si trova nel suo file MyObjectName.cs ... puoi andare a Esplora soluzioni e digitare MyObjectName.cs e visualizzare esattamente 1 file. Tutto ciò che rende il debug migliore è bello.

Un altro vantaggio su una nota simile, se cerchi tutti i file ( ctrl+ shft+ F) per un nome, potresti trovare 20 riferimenti al nome nello stesso file ... e quel nome trovato farà parte di oggetti diversi. Nella finestra Trova risultati tutto ciò che puoi vedere è il numero di riga e il nome del file. Dovresti aprire il file e scorrere per capire in quale oggetto si trovava il riferimento trovato.

Qualunque cosa che renda più semplice il debug, mi piace.


3

Se hai più progetti in una soluzione. Quindi meglio creare un altro progetto Utilities. Quindi creare una cartella \Enumerationse creare un nidificato static class. E quindi assegna ogni classe statica in cui creerai enum che corrisponde al nome dei tuoi progetti. Ad esempio hai un progetto chiamato DatabaseReader e DatabaseUsers, quindi puoi nominare la classe statica come

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

}

Quindi verrà enunciato l'intero enum che può essere utilizzato nell'intera soluzione per progetto. Usa # regionper separare ogni preoccupazione. Con questo, è più facile cercare eventuali enumerazioni


1

Mi piace avere un file di enumerazioni pubbliche chiamato E contenente ciascuna enum separata, quindi è possibile accedere a qualsiasi enum con E ... e sono in un posto da gestire.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.