Prueba de valores Enum bit a bit

Prueba de valores Enum bit a bit

Respuesta corta:Sí :)

Más largo:

1) Todas las operaciones se realizan en el valor entero de la variable flags, por lo que puede pensar en ellas en términos de esto.

2) Sí.

3) Cualquiera de los dos funciona. Sin embargo, vale la pena señalar que si alguien introduce un valor no válido en una variable, el == TrainingComponentTypes.All la versión fallará. Por ejemplo:

var badValue = (TrainingComponentTypes)128 | TrainingComponentTypes.All;
// now badValue != TrainingComponentTypes.All
// but (badValue & TrainingComponentTypes.All) == TrainingComponentTypes.All

Para esta parte:

No estoy seguro de que entienda completamente cómo funciona la enumeración debajo de las sábanas.

The value of All is:
    127 = 1111111 (binary)

The other values are:
    AccreditedCourse       = 0000001
    Qualification          = 0000010
    Unit                   = 0000100
    SkillSet               = 0001000
    UnitContextualisation  = 0010000
    TrainingPackage        = 0100000
    AccreditedCourseModule = 1000000

Como puede ver, Todo es simplemente el bit a bit | de todos estos valores juntos. No puede combinar ningún otro TraningComponentTypes con All, ¡porque All ya los incluye! Además, si los combinas todos juntos con | usted mismo es exactamente lo mismo que usar All directamente (por lo tanto, All es simplemente una conveniencia cuando lo define dentro de una enumeración).

4) podrías utilícelo para verificar Ninguno o Todo, pero no para otros valores.

Vale la pena señalar que hay un método conveniente en Enum que hará estas comprobaciones por usted:Enum.HasFlag.


Sí, lógico en este contexto significa los operadores de igualdad y desigualdad.

Sí, pero hay una manera más fácil:Enum.HasFlag . Por ejemplo:

tct.HasFlag(TrainingComponentTypes.Qualification)

en lugar de:

(tct & TrainingComponentTypes.Qualification) == TrainingComponentTypes.Qualification

Creo que es mejor definir All en el enum como el OR bit a bit de todas sus partes. Pero verás que la gente lo hace de las dos formas.

No, en absoluto. Siéntase libre de usarlos es switch declaraciones. El case los valores deben ser constantes, pero pueden ser expresiones y se comprueba su igualdad. El compilador te dirá si haces algo tonto como tratar de usar el mismo case valor dos veces.