Cómo almacenar varios estados de una variable?
-
13-09-2019 - |
Pregunta
Mi objeto Item
tiene varios estados binarios que pueden combinarse
bool CanBeSold;
bool CanBeBought;
bool CanBeExchanged;
necesito para almacenar combinación actual de valores en una variable. La razón es que necesito para almacenar este valor en dB. En C ++ me gustaría crear una máscara de bits donde un estado ocupa poco de bits. Es una buena práctica en .NET?
Solución
Puede utilizar una enumeración con el atributo Flags
:
[Flags]
enum MyStates {
CanBeSold = 1,
CanBeBought = 2,
CanBeExchanged = 4
}
Dado que las enumeraciones son tipos de datos integrales por debajo de usted puede combinarlos de la manera habitual:
state = MyStates.CanBeSold | MyStates.CanBeExchanged
Tenga en cuenta que esto sólo funciona cuando los valores de enumeración son potencias de dos (como Doug Ferguson se señala en un comentario), por lo que se puede combinar con facilidad y no se superponen cuando se fijan los múltiples.
También puede definir valores como combinaciones de varios otros valores:
CanBeSoldOrBought = CanBeSold | CanBeBought
o
CanBeSoldOrBought = 3
que a su vez también funciona como se esperaba. Esto puede verse, por ejemplo, para los permisos de archivos en ReadWrite por lo general es una combinación de los bits de lectura y escritura.
Y sí, eso es una práctica bastante común. El marco en sí también lo utiliza en varios lugares.
La forma habitual de comprobar para ser ajustado un poco particular, es entonces
if ((state & MyStates.CanBeSold) != 0) { ... }
Otros consejos
Crea una enum donde los valores corresponden a los bits en un número entero. La adición de las Banderas atribuye permitieron hacer más operaciones de bits en los valores de enumeración.
[Flags]
public enum CanBe {
Sold = 1,
Bought = 2,
Exchanged = 4
}
Ahora sólo puede utilizar el operador or entre los valores:
CanBe can = CabBe.Sold | CanBe.Exchanged.
Se puede añadir un estado con el | = operador:
can |= CanBe.Sold;
O varios estados:
can |= CanBe.Sold | CanBe.Bought;
Puede mantener un estado con el & operador =:
can &= CanBe.Sold;
O varios estados:
can &= CanBe.Sold | CanBe.Bought;
Puede eliminar estados utilizando el operador ~ para crear un complemento a un valor:
can &= ~CabBe.Bough;
O estados seveal:
can &= ~(CabBe.Bough | CanBe.Exchanged);
Puede comprobar si hay un estado usando el operador &:
if ((can & CanBe.Sold) != 0) ...
O varios estados a la vez:
if ((can & (CanBe.Sold | CanBe.Bought)) != 0) ...
O compruebe que varios estados son todo listo:
if ((can & (CanBe.Sold | CanBe.Bought)) == (CanBe.Sold | CanBe.Bought)) ...
Puede hacer esto con máscaras de bits en .NET también.
Dentro de su enumeración puede definir sus estados como valores
public enum ItemState { CanBeSold = 1; CanBeBought = 2; CanBeExchanged = 4 }
A continuación, dentro de su objeto, puede hacer
if (item.State ^ ItemState.CanBeSold) ....
Se puede utilizar una enumeración Banderas con cada bit especificado
[Flags]
enum MyStates {
CanBeSold = 0x1,
CanBeBought = 0x2,
CanBeExchanged = 0x4,
}
MyStates m_Flags;
// to set a flag:
m_Flags |= MyStates.CanBeSold;
// to unset a flag:
m_Flags &= ~MyStates.CanBeSold;