2016-03-09 17 views
13

ho ottenuto questo enumCome ottimizzare l'assegnazione enum in C#

enum NetopScriptGeneratingCases 
{ 
    AddLogMessages, 
    AddLogErrors, 
    AddLogJournal, 
    AllLog = AddLogMessages | AddLogErrors | AddLogJournal, 
    DoNothing 
} 

e c'è UI con 3 caselle di controllo in modo che a seconda di loro vengono controllati devo generare possibili casi da fare qualche lavoro.

Ma non sono sicuro che questo codice sia corretto ... Esistono altri modi per farlo?

+9

Se avete intenzione di utilizzare il 'enum' come un insieme di bandiere, come si eseguendoli insieme per creare 'AllLog', devi dare loro i valori che sono poteri di 2. Devi impostare il primo a 1, poi a 2, quindi a 4, e' DoNothing' dovrebbe essere impostato su 0. – juharr

+3

Il modo in cui il codice è scritto è difettoso, penso, dal momento che il primo controllo ingoierà molti altri controlli; dovresti provare con i casi più specifici e lasciare che i casi più generali finiscano. –

risposta

18

Vorrei prendere quello Chris suggest in his answer e assegnare la variabile in questo modo:

NetopScriptGeneratingCases netopScriptGeneratingCases = NetopScriptGeneratingCases.DoNothing; 

if (checkBoxAddAuditLog.Checked) 
{ 
    netopScriptGeneratingCases |= NetopScriptGeneratingCases.AddLogJournal; 
} 
if (checkBoxAddErrorLog.Checked) 
{ 
    netopScriptGeneratingCases |= NetopScriptGeneratingCases.AddLogErrors; 
} 
if (checkBoxAddLogMessages.Checked) 
{ 
    netopScriptGeneratingCases |= NetopScriptGeneratingCases.AddLogMessages; 
} 
21

Come menzionato nel commento, il compilatore fornirà per impostazione predefinita un valore intero incrementale, che non è adatto all'utilizzo come bitflags. Prova che modifica la tua definizione come segue:

[Flags] 
enum NetopScriptGeneratingCases 
{ 
     DoNothing = 0, 
     AddLogMessages = 1<<0, 
     AddLogErrors = 1<<1, 
     AddLogJournal = 1<<2, 
     AllLog = AddLogMessages | AddLogErrors | AddLogJournal 
} 
+0

Addendum: per fare il contrario, quindi controlla quali sono impostati, tu E contro quel campo (ad esempio 'if (values ​​& Enum.AddLogMessages)') o una maschera di bit di 1s per ottenerli tutti. – edmz