2010-02-17 15 views
142

Ho una classe che utilizza un'enumerazione, l'enum è attualmente nel proprio file che sembra sprecato.Le enumerazioni in C# dovrebbero avere il loro file?

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

Modifica

Devo dire che, mentre la classe in questione utilizza questi enumerazioni, così fa chiamanti esterni. In altre parole, un'altra classe può impostare queste enumerazioni. Quindi non sono utilizzati internamente alla classe, altrimenti questa domanda sarebbe una cosa da niente.

+70

Se hai usato numeri magici, non avresti questo problema. – MusiGenesis

+7

Dovrebbe essere wiki della comunità? Non esiste una risposta corretta e non ci sono reali considerazioni tecniche oltre alle funzionalità IDE. –

+1

Possono ancora essere 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, allora direi, di solito, no. Altrimenti, potresti avere la tua comprensione degli spazi dei nomi sbagliata e dovresti leggerli (non molto per loro, solo un meccanismo organizzativo) –

risposta

77

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

+6

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

+88

@ Finglas: il rumore di una persona è il segnale di un'altra persona! –

+2

Di solito c'è una classe che è più strettamente associata. Ma se questo cambia, se qualcuno arriva in un momento decide di prendere una dipendenza dall'enum, allora è il momento di un refactoring. –

53

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

Ma in genere si trovano tramite la chiave F12.

+4

Penso che questo è probabilmente l'opzione migliore in quanto: 1) è solo un file invece di molti che potrebbe essere considerato come ingombrare la directory 2) è chiaro ciò che è contenuto all'interno del file 3) mezzi che sai dove trovare un 'enum' invece che in un file che contiene una classe che è correlata ma non _necessariamente_ l'unica classe che lo usa –

+3

Non mi piace assolutamente. Come detto nella risposta di James Curran, le enumerazioni hanno una relazione soprattutto con le classi. Quando li mettono tutti in un unico file globale, non sono nemmeno in una directory (per un sottospazio) dove potrebbero appartenere tematicamente. –

+2

Sì @DebugErr, sono d'accordo con te. Dal momento che questa risposta è stata postata nel 2010, sono cambiato tra vari approcci e tendono ad andare con un file per tipo, o dichiarando enum nello stesso file della classe correlata. –

59

Questo è davvero solo una questione di preferenza.

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

Inserire un singolo tipo in ogni file facilita l'identificazione delle modifiche nei sistemi di controllo del codice sorgente senza diffondere.

+8

"Mettere un singolo tipo in ogni file facilita anche l'identificazione delle modifiche nei sistemi di controllo del codice sorgente senza diff." La paura di diffondere non dovrebbe costituire la base delle tue decisioni progettuali. Direi anche che chiunque non sappia come diff correttamente un file nel controllo del codice sorgente in realtà non usa affatto il controllo del codice sorgente. – Dan

1

Mi piace avere un file di enumerazione pubblico denominato E contenente ogni enum separato, quindi qualsiasi enum è accessibile con E ... e sono in un posto da gestire.

9

In genere preferisco che il mio enum sia nello stesso file della classe che probabilmente sarà un attributo di. Se ad esempio ho una classe Task, l'enum TaskStatus sarà nello stesso file.

Tuttavia, se ho enumerazioni di natura più generica, le mantengo contestualmente in vari file.

7

Penso che dipenda dalla portata dell'enum. Per esempio, se l'enumerazione è specifico per una classe, ad esempio, utilizzato per evitare lo scenario costante magica, allora direi messo nello stesso file della classe:

enum SearchType { Forward, Reverse } 

Se l'enum è generale e può essere usato da più classi per diversi scenari, quindi sarei propenso a metterlo in un suo file. Ad esempio, il seguito potrebbe essere utilizzato per diversi scopi:

enum Result { Success, Error } 
5

tendo a mettere le enumerazioni nel proprio file per un motivo molto semplice: come con le classi e le strutture, è bello sapere esattamente dove cercare se vuoi 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 produce anche file separati per i delegati.

17

Posiziono principalmente all'interno del namespace e all'esterno della classe in modo che sia facilmente accessibile altre classi in tale spazio dei nomi come di seguito.

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

Wow. Non ho saputo che le enumerazioni possono essere inserite direttamente nello spazio dei nomi. Vado con questa risposta All'interno della mia struttura MVC saranno posizionati all'interno del controller ciò che mi rende logica. Grazie per questo. Upvoted. – C4u

35

La domanda da porsi sarebbe: c'è nulla di un tipo di censimento nel C# che indica dovrei trattare in modo diverso da tutti gli altri tipi che creo?

Se l'enumerazione è pubblica, deve essere trattata come qualsiasi altro tipo pubblico. Se è privato, dichiararlo come membro annidato della classe che lo utilizza. Non vi è alcun motivo valido per inserire due tipi pubblici nello stesso file semplicemente perché uno è un'enumerazione. Il fatto che sia un tipo pubblico è tutto ciò che conta; il sapore del tipo non lo fa.

5

Un vantaggio dell'utilizzo di un file separato per l'enumerazione è che è possibile eliminare la classe originale che ha utilizzato l'enum e scrivere una nuova classe utilizzando l'enum.

Se l'enumerazione è indipendente dalla classe originale, inserirla in un file separato facilita le modifiche future.

19

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.

7

Dipende da quale accesso è necessario.

Se l'enumerazione viene utilizzata solo da una singola classe, è possibile dichiararla all'interno di quella classe perché non è necessario utilizzarla da nessun'altra parte.

Per le enumerazioni utilizzate da più classi o in un'API pubblica, quindi manterrò sempre la definizione nel proprio file nello spazio dei nomi appropriato. È molto più facile trovarlo in questo modo, e la strategia segue lo schema di un oggetto per file, che è buono da usare anche con le classi e le interfacce.

5

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

Per le soluzioni di piccole dimensioni, non importa, ma per le grandi, diventa ancora più importante mantenere le classi e le enumerazioni nei propri file. Puoi trovarli rapidamente, modificarli e altro ancora. Consiglio vivamente di inserire l'enumerazione nel proprio file.

E come è stato detto ... Quanto è sprecato un file che finisce per essere solo un paio di kb lo stesso?

+0

Uso anche questo componente aggiuntivo, è piuttosto utile. Metterei le enumerazioni nel loro file, non importa se la soluzione è grande o piccola. –

0

Se si dispone di più progetti in un'unica soluzione. Quindi meglio creare un altro progetto Utilities. Quindi creare una cartella \Enumerations e creare uno static class nidificato. E poi assegna ogni classe statica in cui creerai enum che corrisponde al nome dei tuoi progetti. Per esempio si dispone di un progetto denominato DatabaseReader e DatabaseUsers allora si potrebbe denominare 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 

} 

Poi intero enum che può essere utilizzato in tutta soluzioni per progetti saranno dichiarati su di esso. Utilizzare # region per separare ogni preoccupazione. Con questo, è più facile cercare eventuali enumerazioni

Problemi correlati