2009-11-24 25 views
10

Me preguntaba si el atributo Enums with Flag se usa principalmente para operaciones de Bitwise, ¿por qué no los compiladores generan automáticamente los valores si los valores enum no están definidos?C# Enums with Flags Attribute

Por ej.

 
[Flags] 
public enum MyColor 
{ 
    Yellow = 1, 
    Green = 2, 
    Red = 4, 
    Blue = 8 
} 

Sería útil si los valores 1,2,4,8 se autogeneran si no están asignados. Me gustaría saber tu opinión sobre esto.

Respuesta

3

Probablemente podrían, pero con un compilador 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.

13

Ésta es un poco más fácil:

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

¿Cómo responde esto la pregunta? ... – SKG

+0

Le ahorra la necesidad de calcular el siguiente valor disponible – Ofir

+0

¿Qué es el pseudo inglés para 1 << 0? –

3

espero que se debe a la instancia FlagsAttribute está siendo compilado junto con, o después de, la enumeración. Es decir, decorar un objeto con un atributo (como [Banderas]) 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 instanciación en tiempo de ejecución del atributo) es la entidad a la que hace referencia. Puede ser que la entidad enum deba compilarse antes que sus atributos, por lo que un atributo no podría afectar a la entidad a la que se refiere (en este caso, enum). No sé que esta declaración sea cierta, solo es una suposición.

Lo mejor es que los atributos, como [Banderas], son en realidad entidades y no modificaciones del tipo decorado.

2

Creo que, entre otras cosas, se reduciría a la confusión masiva de lo que sería el primer valor. Considere:

[Flags] 
public enum MyColor 
{ 
    Yellow, 
    Green, 
    Red, 
    Blue 
} 

public class SomeClass 
{ 
    public MyColor SomeColor; // Yellow or undefined by default? 
} 

Cuando una clase se instancia todos sus campos son normalmente solo ponen a cero (referencias se vuelven nulos y valores se convierten en cero). Pero si el primer valor fuera uno, entonces el compilador tendría que manejar las enumeraciones Flag de forma diferente a cualquier otra cosa.

Por lo tanto, teniendo en cuenta esto, y también el hecho de que es muy útil para poder poner a cero un campo de bits, se llega a la conclusión de que el primer campo en realidad debería lógicamente ser 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 materia más complicado surgiría 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 mejor que explicarlo de forma explícita para evitar la confusión masiva! :-)