Pensavo che questo potrebbe essere utile per altre persone che sono inciampate qui come me.
Fare attenzione a come si gestiscono i valori di enumerazione che è possibile impostare per avere un valore == 0 (a volte può essere utile avere uno stato Sconosciuto o Inattivo per un enum). Causa problemi quando ci si basa su queste operazioni di manipolazione dei bit.
Anche quando si hanno valori enum che sono combinazioni di altre potenze di 2 valori, ad es.
public enum Colour
{
None = 0, // default value
RED = 2,
BLUE = 4,
GREEN = 8,
YELLOW = 16,
Orange = 18 // Combined value of RED and YELLOW
}
In questi casi un metodo di estensione di questo tipo potrebbe rivelarsi utile:
public static Colour UnSet(this Colour states, Colour state)
{
if ((int)states == 0)
return states;
if (states == state)
return Colour.None;
return states & ~state;
}
E anche il metodo isset equivilent che gestisce i valori combinati (anche se un po 'di un modo hacky)
public static bool IsSet(this Colour states, Colour state)
{
// By default if not OR'd
if (states == state)
return true;
// Combined: One or more bits need to be set
if(state == Colour.Orange)
return 0 != (int)(states & state);
// Non-combined: all bits need to be set
return (states & state) == state;
}
fonte
2012-03-01 11:03:20
Piccola nota: un enum bit a bit in C# dovrebbe ottenere l'attributo [Flags] sopra di esso. – Nyerguds
@Nyerguds, potresti spiegare perché dovrebbe ottenere l'attributo? – ethane
Offre un supporto IntelliSense migliore durante il debug, poiché riconosce i valori enum sconosciuti come combinazioni di valori esistenti. – Nyerguds