2009-03-05 17 views
67

Stavo leggendo le enumerazioni e le trovavo molto simili alla dichiarazione delle costanti. Come faccio a sapere quando usare una costante piuttosto che una enumerazione o viceversa. Quali sono alcuni dei vantaggi dell'utilizzo di enumerazioni?Enums and Constants. Quale usare quando?

+0

vedere anche http://stackoverflow.com/questions/755685/c-static-readonly-vs-const –

+0

vedere anche http://stackoverflow.com/questions/11575376/why-use-enums-instead-of -conti per domande simili per Java (le risposte si applicano principalmente anche a C#). –

risposta

68

Utilizzare le enumerazioni quando si desidera definire un intervallo di valori che qualcosa può essere. Il colore è un esempio evidente come:

public enum Colour 
{ 
    White, 
    Red, 
    Blue 
} 

O forse un insieme di possibili cose come: (Esempio ho rubato a here come io sono pigro)

[FlagsAttribute] 
enum DistributedChannel 
{ 
    None = 0, 
    Transacted = 1, 
    Queued = 2, 
    Encrypted = 4, 
    Persisted = 16, 
    FaultTolerant = Transacted | Queued | Persisted 
} 

costanti dovrebbero essere per un singolo valore , come il PI. Non c'è un intervallo di valori PI, c'è solo PI.

+0

Cosa succede se si finisce con l'uso di '.ToString()' sull'enumerazione, qualsiasi valore nell'uso di una classe con stringhe const che si comporta e si comporta come un enum ma circoscrive una chiamata a 'ToString()'? [Esempio] (https://hastebin.com/exehipiwut.cs) – Sinjai

+0

Aspetta, penso di aver risposto alla mia stessa domanda. Il codice in quell'esempio non funzionerebbe: dovresti prendere l'input come una stringa, che non si comporterebbe veramente come un enum. – Sinjai

16

Una costante è una funzione del linguaggio che dice che la variabile non cambierà valore (quindi il compilatore può fare ottimizzazioni intorno a quella conoscenza) dove un enum è un tipo specifico.

Le costanti possono essere qualsiasi tipo di dati, ma un enum è un enum.

Uso un enum in qualsiasi posto in cui si possa avere un numero di opzioni e si desidera migliorare la leggibilità del codice. Ad esempio, è possibile avere livelli di traccia come int con i valori 0, 1, 2 o come enumerazione come errore, avviso e informazioni.

Enum ha anche la possibilità di essere utilizzato come operatori bit a bit, ad esempio FontStyle.Bold | FontStyle.Italic ti darebbe caratteri in grassetto e corsivo.

5

Oltre alla risposta di Robert:

  1. Usa enum per un insieme finito di valori denominati. Non ti interessa davvero il valore numerico di ciascun simbolo (ma hai ancora la possibilità di imporli, ad esempio per compatibilità con un sistema legacy).

  2. Robert: Sì, è possibile utilizzare Enum come campi di bit. Utilizzare l'attributo Flags (e assicurarsi che i membri dell'enum abbiano valori numerici adatti).

3

Una costante C# è simile a una variabile in quanto fornisce un nome definito a un valore. Tuttavia, una costante differisce da una variabile standard perché una volta definita, il valore assegnato alla costante non può mai essere modificato. Il vantaggio principale delle costanti è la loro assistenza nella creazione di codice auto-documentante e nel consentire la dichiarazione dei valori chiave in un unico posto, che consente una facile manutenzione nel caso in cui il valore debba essere aggiornato e il software ricompilato.

Mentre gli elenchi di enumeratori sono utili per definire sequenze e stati, in particolare quando c'è una progressione naturale attraverso questi stati. Questo perché ogni costante nell'elenco può essere formattata e confrontata utilizzando il suo nome o valore. Un enum può anche essere usato per definire un insieme limitato di valori validi.

+0

"Elenchi di enumeratori"? –

22

Ciò che manca dalle altre risposte è che le enumerazioni hanno un tipo di base intero. È possibile modificare il valore predefinito da int a qualsiasi altro tipo integrale, tranne char come:

enum LongEnum : long { 
    foo, 
    bar, 
} 

È possibile lanciare in modo esplicito da e implicitamente al tipo di base, che è utile in switch-dichiarazioni. Attenzione, si può lanciare qualsiasi valore del tipo base su un enum, anche se l'enum non ha membri con il valore appropriato.Quindi usare sempre la sezione predefinita in un interruttore è una buona idea. BTW, .NET stesso consente anche enumerazioni a virgola mobile, ma non è possibile definirle in C#, anche se penso che si possano ancora usare (tranne in switch).

Inoltre, l'utilizzo di enumerate offre maggiore sicurezza del tipo. Se intendi utilizzare ad es. int constanti come parametri del metodo, quindi potrei chiamare il metodo con qualsiasi valore int. Certo, via casting può accadere anche con enumerazioni, ma non accadrà casualmente. Peggio ancora è la possibilità di confondere l'ordine dei parametri.

void method(int a, int b) {...} 

Se costante A solo può andare in un costante e B solo può andare in b, quindi utilizzando due tipi enum diversi scoprirà qualsiasi abuso durante la compilazione.