2010-08-10 8 views
10

Estaba estudiando cómo las enumeraciones se pueden usar como indicadores de bits decorándolos con el atributo de banderas y los operadores de bitwize (ver a continuación).Usos reales de indicadores de bits en .NET framework

¿Hay algún lugar en el marco de .NET que este patrón se utiliza? Me gusta esto, pero quiero ver algunos ejemplos de la vida más reales

[Flags] 
enum Days2 : int 
{ 

    None = 0x0, 
    Sunday = 0x1, 
    Monday = 0x2, 
    Tuesday = 0x4, 
    Wednesday = 0x8, 
    Thursday = 0x10, 
    Friday = 0x20, 
    Saturday = 0x40 
} 

    Days2 meetingDays = Days2.Tuesday | Days2.Thursday; 

    // Set an additional flag using bitwise OR. 
    meetingDays = meetingDays | Days2.Friday; 

    Console.WriteLine("Meeting days are {0}", meetingDays); 

Respuesta

11

Sí - mira MethodBase.Attributes por ejemplo, decir si es un miembro del público, etc. estática

FileAccess y FileOptions son ejemplos basados ​​en archivos, también.

Si abre el reflector, busque FlagsAttribute y luego presione "Analizar" (Ctrl-R) y expanda "usado por", verá un montón de tipos usándolo. Sin embargo, lleva un tiempo :)

+1

Doh! Sabía que debería haber una forma de encontrarlo en el reflector, en lugar de crear algún código. –

2

Hay muchos lugares donde el FlagsAttribute se utiliza para las enumeraciones en el BCL.

Aquí hay un ejemplo: el parámetro BindingFlags utilizado en el código de reflexión.

2

Hay un montón de lugares se utiliza, se utiliza en el marco .NET en atributos de archivo, he visto que se usa como banderas de seguridad, es decir,

enum Roles 
{ 
    None = 0, 
    User = 1, 
    Admin = 2, 
    Superman = 4 
} 

if (_user.Roles & Roles.Admin != Roles.None) { user-is-admin } 
if (_user.Roles & Roles.Superman != Roles.None) { user-is-also-superman } 

Básicamente son grandes para cualquier escenario en el que tiene una selección de atributos posibles para algo, si tiene algo que podría ser una selección de colores, por ejemplo, una selección de grupos étnicos, etc.

Otro lugar común para verlos es que los cuadros de diálogo de winforms tienen atributos compuestos de ellos, puedes juntarlos para un cuadro de mensaje para decidir la selección de botones que obtienes Ok | Cancelar | Ignorar etc.

5

Una de las enumeraciones de [Flags] más comunes que verá es la enumeración de opciones de expresiones regulares. He aquí un ejemplo:

Regex rxInsensitive = new Regex(@"\b(?<word>\w+)\s+(\k<word>)\b", 
      RegexOptions.Compiled | RegexOptions.IgnoreCase); 

Más aquí: hace http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx

años escribí un tutorial sobre el uso de las enumeraciones de bits en .Net, tal vez esto ayude: http://www.johnsample.com/articles/BitwiseEnums.aspx

2

Hay un montón de ejemplos en los ensambles de mscorlib y del sistema, aunque la cantidad que encontrará en el uso diario es una pregunta más difícil.

Por ejemplo, System.Threading.ThreadState es una combinación del estado del subproceso actual y las solicitudes pendientes.

que efectivamente vertido a cabo todas las enumeraciones de bandera en el sistema y mscorlib, solo por diversión, y luego fue en busca de los interesantes:

Dim types = (From t In Reflection.Assembly.GetAssembly(GetType(Int32)).GetTypes() Select t).Concat(_ 
       (From t In Reflection.Assembly.GetAssembly(GetType(Uri)).GetTypes() Select t)) 

    For Each t As Type In types 
     If t.IsEnum AndAlso (From att In t.GetCustomAttributes(True) Where TypeOf (att) Is FlagsAttribute).Any() Then 
      Console.WriteLine("Flag Enum: {0}", t.ToString()) 
     End If 
    Next 
    Console.ReadLine() 
2

¿Qué pasa cuando el establecimiento font style opciones, tales como:

this.Font = new Font(this.Font, FontStyle.Bold | FontStyle.Italic); 
Cuestiones relacionadas