Tengo una enumeración de bandera a continuación.
[Flags]
public enum FlagTest
{
None = 0x0,
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4
}
No puedo hacer que la declaración if se evalúe como verdadera.
FlagTest testItem = FlagTest.Flag1 | FlagTest.Flag2;
if (testItem == FlagTest.Flag1)
{
// Do something,
// however This is never true.
}
¿Cómo puedo hacer esto verdad?
None
indicador con un valor de cero. Ver msdn.microsoft.com/en-us/library/vstudio/…&
operador de comparación,|
es como una adición:1|2=3
,5|2=7
,3&2=2
,7&2=2
,8&2=0
.0
evalúa afalse
, todo lo demás atrue
.Respuestas:
En .NET 4 hay un nuevo método Enum.HasFlag . Esto te permite escribir:
que es mucho más legible, en mi opinión.
La fuente .NET indica que esto realiza la misma lógica que la respuesta aceptada:
fuente
Enum
clase.(testItem & FlagTest.Flag1)
es una operación AND a nivel de bit.FlagTest.Flag1
es equivalente a001
con la enumeración de OP. Ahora digamos quetestItem
tiene Flag1 y Flag2 (por lo que es bit a bit101
):fuente
Para aquellos que tienen problemas para visualizar lo que está sucediendo con la solución aceptada (que es esto),
testItem
(según la pregunta) se define como,Luego, en la declaración if, el lado izquierdo de la comparación es,
Y la declaración if completa (que se evalúa como verdadera si
flag1
se establece entestItem
),fuente
@ phil-devaney
Tenga en cuenta que, excepto en los casos más simples, Enum.HasFlag conlleva una fuerte penalización de rendimiento en comparación con la escritura manual del código. Considere el siguiente código:
Más de 10 millones de iteraciones, el método de extensión HasFlags toma la friolera de 4793 ms, en comparación con los 27 ms para la implementación bit a bit estándar.
fuente
(«flag var» & «flag value») != 0
no funciona para mi La condición siempre falla y mi compilador (Unity3D's Mono 2.6.5) informa una "advertencia CS0162: Código inalcanzable detectado" cuando se usa en unif (…)
.… = 1, … = 2, … = 4
en los valores de enumeración es de importancia crítica cuando se usa[Flags]
.1
Supuse que comenzaría las entradas en y avanzaría por Po2s automáticamente. El comportamiento se ve consistente en MS .NET y Mono con fecha de Unity. Mis disculpas por poner esto en ti.Configuré un método de extensión para hacerlo: pregunta relacionada .
Básicamente:
Entonces puedes hacer:
Por cierto, la convención que uso para las enumeraciones es singular para estándar, plural para banderas. De esa manera, usted sabe por el nombre de enumeración si puede contener múltiples valores.
fuente
HasFlag
extensión.Un consejo más ... Nunca haga la verificación binaria estándar con la bandera cuyo valor es "0". Su verificación en esta bandera siempre será verdadera.
Si comprueba binariamente el parámetro de entrada con FullInfo, obtendrá:
bPRez siempre será verdadero como CUALQUIER COSA & 0 siempre == 0.
En su lugar, simplemente debe verificar que el valor de la entrada es 0:
fuente
fuente
Para las operaciones con bits, debe usar operadores bit a bit.
Esto debería funcionar:
Editar: se corrigió mi verificación if: volví a mis formas C / C ++ (gracias a Ryan Farley por señalarlo)
fuente
En cuanto a la edición. No puedes hacerlo realidad. Le sugiero que ajuste lo que desea en otra clase (o método de extensión) para acercarse a la sintaxis que necesita.
es decir
fuente
Prueba esto:
Básicamente, su código le pregunta si tener ambas banderas establecidas es lo mismo que tener una bandera establecida, lo que obviamente es falso. El código anterior dejará solo el bit Flag1 establecido si está configurado, luego compara este resultado con Flag1.fuente
incluso sin [Banderas], podrías usar algo como esto
o si tienes una enumeración de valor cero
fuente