Enums C # con el atributo Banderas

Me preguntaba si el atributo Enums with Flag se usa principalmente para las operaciones de Bitwise, por qué no los comstackdores generan automáticamente los valores si los valores de enum no están definidos.

Por ejemplo.

 [Banderas]
 enumeración pública MyColor
 {
     Amarillo = 1,
     Verde = 2,
     Rojo = 4,
     Azul = 8
 }

Sería útil que los valores 1,2,4,8 se autogeneren si no se asignan. Me gustaría saber sus pensamientos sobre esto.

Esto es un poco más fácil:

[Flags] public enum MyColor { Yellow = 1<<0, Green = 1<<1, Red = 1<<2, Blue = 1<<3 } 

Probablemente podrían, pero con un comstackdor de este tamaño deben tener en cuenta el tiempo y los recursos necesarios para implementar algo frente al beneficio potencial, especialmente con azúcar sintáctico como este. Y es solo azúcar sintáctica porque puedes escribirla manualmente.

Supongo que es porque la instancia de FlagsAttribute se está comstackndo junto con, o después, el Enum. Es decir, decorar un objeto con un atributo (como [Flags]) provoca la creación de un objeto de atributo, no modifica el objeto base de una manera fundamental.

Además, parte de la información almacenada (para la ejemplificación en tiempo de ejecución del atributo) es la entidad a la que se refiere. Puede ser que la enumeración de la entidad deba comstackrse antes de sus atributos, por lo que un atributo no podría afectar a la entidad a la que hace referencia (en este caso, enumeración). No sé si esta afirmación sea cierta, es solo una suposición.

La gran conclusión es que los atributos, como [Flags], son en realidad entidades en sí mismas y no modificaciones del tipo decorado.

Creo que, entre otras cosas, se reduciría a una confusión masiva de cuál sería el primer valor. Considerar:

 [Flags] public enum MyColor { Yellow, Green, Red, Blue } public class SomeClass { public MyColor SomeColor; // Yellow or undefined by default? } 

Cuando se crea una instancia de una clase, todos sus campos están normalmente en cero (las referencias se vuelven nulas y los valores se vuelven cero). Pero si el primer valor sería uno, entonces el comstackdor tendría que manejar las enumeraciones de Flag de forma diferente a cualquier otra cosa.

Entonces, considerando esto, y también el hecho de que es muy útil poder poner a cero un campo de bits, llegamos a la conclusión de que el primer campo debería ser lógicamente cero:

 [Flags] public enum MyColor { Black, //0 Yellow, //1 Green, //2 Red, //3 Blue //4 } 

Pero supongo que no mucha gente se daría cuenta de esto (sin los comentarios anteriores). Y más cosas difíciles surgirían también:

 [Flags] public enum MyColor { Black, Red, Green, Blue, Magenta = Red | Blue, Yellow = Red | Green | Blue, SomeOtherColor // now what would the value of this automatically be? } 

¡Probablemente sea mejor explicarlo explícitamente para evitar una confusión masiva! 🙂

    Intereting Posts