¿Qué se esconde detrás del atributo [Flags] en C#?
\n\nSi alguna vez has escrito en C# y has visto en código ajeno un extraño atributo [Flags] antes de un enum, lo más probable es que te hayas preguntado: "¿Y si no lo pongo, el código dejará de funcionar?"
Spoiler: no dejará de funcionar. Pero tu código se parecerá a una bicicleta con ruedas cuadradas. Hoy analizaremos qué significa el atributo [Flags] en C#, cómo usarlo correctamente en 2025 y por qué sin él tus enum son solo números, no combinaciones significativas.
El tema está tomado de una pregunta real en Stack Overflow que ha acumulado miles de visitas. Y no es casualidad: el uso correcto de las banderas de bits es una de esas habilidades que distingue a un desarrollador que entiende las entrañas del lenguaje de alguien que simplemente "copia y pega de MSDN".
\n\n¿Qué es realmente [Flags] en C#?
\n\nEl atributo [Flags] no es un interruptor mágico que cambie el comportamiento del compilador. Es una marca para el desarrollador y para las herramientas (por ejemplo, para el depurador de Visual Studio o la salida de consola).
Cuando escribes:
\n\n[Flags]\npublic enum FilePermissions\n{\n None = 0,\n Read = 1,\n Write = 2,\n Execute = 4,\n Delete = 8\n}\n\nEstás diciendo: "Oye, esta enumeración no es para elegir una opción, sino para combinar varias". Sin el atributo [Flags], C# no sabe que vas a hacer operaciones de bits. Pero técnicamente — puedes.
Cómo funciona la magia de los bits
\n\nLos valores 1, 2, 4, 8 no se eligen al azar. En sistema binario son:
- \n
1= 0001 \n 2= 0010 \n 4= 0100 \n 8= 1000 \n
Cada bandera ocupa su propio bit. Por lo tanto, puedes combinar Read y Write como 1 | 2 = 3 (0011). Y el sistema entenderá: "Oh, ambas banderas están activadas".
Si hubieras elegido los valores 1, 2, 3, 4 — la combinación 1 | 2 = 3 sería indistinguible del valor Execute = 3. Por eso las banderas de bits requieren potencias de dos.
¿Para qué sirve [Flags] si puedo simplemente poner números?
\n\nSí, técnicamente puedes usar operaciones de bits sin el atributo. Pero:
\n\n- \n
- Legibilidad del código:
permissions.HasFlag(FilePermissions.Write)es más claro que(permissions & 2) != 0. \n - Depuración: Visual Studio mostrará
Read, Writeen lugar del número3. \n - ToString(): la llamada
myFlags.ToString()devolverá "Read, Write" en lugar de "3". \n - Autodocumentación: cualquier desarrollador, al ver
[Flags], entenderá inmediatamente la intención. \n
Sin el atributo [Flags] en C# pierdes todos estos beneficios. El código funciona, pero parece "lo escribí a las 2 de la mañana antes de la fecha límite".
\n\nMejores prácticas para trabajar con [Flags] en 2025
\n\n1. Usa siempre potencias de dos
\n\nEsta es la regla número uno. Valores 1, 2, 4, 8, 16, 32... — y de ninguna otra manera. Para mayor comodidad, puedes usar notación hexadecimal:
[Flags]\npublic enum DayOfWeek\n{\n None = 0,\n Monday = 0b_0000_0001, // 1\n Tuesday = 0b_0000_0010, // 2\n Wednesday = 0b_0000_0100, // 4\n Thursday = 0b_0000_1000, // 8\n Friday = 0b_0001_0000, // 16\n Weekend = Monday | Tuesday | Wednesday | Thursday | Friday\n}\n\nTen en cuenta: incluye siempre None = 0. Sin él, tu enum por defecto será igual a 0, lo que podría significar "nada seleccionado".