2011-02-10 21 views
7

Quindi, ho uno "stato" variabile in una classe. Voglio dichiararlo come un numero intero in modo da poter salvare alcune affermazioni.È buona norma usare enum come int?

int state; 

Un modo per farlo è quello di dichiarare uno Stato enum {One = 0, Due = 1, Tre = 3}, e poi nella dichiarazione switch, diventerebbe:

switch (state) 
{ 
case One: 
    dosomething(); 
    break; 
case Two: 
    dosomething(); 
    break; 
case Three: 
    dosomething(); 
    break; 
} 

Quindi, è una buona pratica usare enum come questo? C'è un modo migliore per farlo?

Grazie!

+18

Dichiarare un'enumerazione con gli enumeratori denominati 'One',' Two' e 'Three' corrispondenti ai valori' 0', '1' e' 2' è una pessima idea. –

+4

I valori corrispondenti sono effettivamente 0, 1 e 3.:) – Marlon

+1

Era un esempio. – Snowfish

risposta

12

Sì, è un buon modo per farlo. Generalmente usi enums per semplificarti la vita, un sacco di numeri diversi che non dicono realmente ad altri programmatori qualcosa che non sia abbastanza utile.

Quindi questo è un ottimo modo per usarlo, rende il vostro codice leggibile e comprensibile.

Anche se @James McNellis ha sottolineato, nominare le enumerazioni come "1,2,3,4" è una cattiva idea, poiché non esprime ciò che realmente fa.

Ma ho il sospetto che sia stato solo un esempio dalla tua parte.

Considerate questo, invece:

switch (operationState) 
{ 
    case Waiting: 
     dosomething(); 
     break; 
    case Running: 
     dosomething(); 
     break; 
    case Ended: 
     dosomething(); 
     break; 
} 

In questo caso, il "funzionamento" quando è: In attesa, In esecuzione o sbilanciati, il che lo rende leggibile e comprensibile. Consideriamo ora la via senza enumerazioni:

switch (iState) 
{ 
    case 997: 
     dosomething(); 
     break; 
    case 998: 
     dosomething(); 
     break; 
    case 999: 
     dosomething(); 
     break; 
} 

Cosa dice 997? Assolutamente Niente! Usa codice leggibile e comprensibile per rendere la vita a tutti più facile.

+0

Ben spiegato perché le enumerazioni sono così utili. Quando si sviluppa codice e si ha un vero suggerimento, si digita "myEnum ::" e quindi avere un elenco di tutti i valori che si possono usare è fantastico. È bene ricordare che è possibile cambiare i valori effettivi dell'enumerazione e il codice "non dovrebbe" rompere ... ma alcune persone potrebbero aver fatto cose strane, come leggere il valore dell'enumerazione e contare su di esso quel valore. Ma direi che era il loro codice povero, non il tuo. – thecoshman

0

L'utilizzo di nomi di stato leggibili in un'istruzione switch anziché in numeri, mi sembra soddisfacente. E non penso che influenzerà anche le prestazioni.

Quindi nessuna ragione per non usare le enumerazioni!

7

Tutto il codice di cui sopra funziona altrettanto bene se si dispone di state dichiarato come State anziché int. Puoi usarlo in un'istruzione switch, assegnargli nuovi valori, fare paragoni con esso, ecc. Non ci sono davvero vantaggi nell'usare uno int qui, poiché è essenzialmente "giace nel codice sorgente". La tua variabile non è un intero. Non ha senso moltiplicarlo o dividerlo per un valore, o per spostarlo a sinistra o a destra. Contrassegnare la variabile come State rende più chiaro il fatto che tu stia davvero tenendo uno di più valori e ti impedisce di fare alcuni degli errori sopra riportati. Inoltre, dà il compilatore una migliore possibilità di diagnosticare le cose in questo modo:

state = 137; // Error! Can't do this assignment without a cast. 

In generale, utilizzare il sistema di tipo a vostro vantaggio. Se è un int, trasformalo in int. Se si tratta di un tipo enumerato, rendilo un tipo enumerato.

Problemi correlati