El secreto de [Flags] en C#: cómo escribir código que incluso los juniors entenderán

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué se esconde detrás del atributo [Flags] en C#?

\n\n

Si 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?"

\n\n

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.

\n\n

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\n

El 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).

\n\n

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\n

Está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.

\n\n

Cómo funciona la magia de los bits

\n\n

Los valores 1, 2, 4, 8 no se eligen al azar. En sistema binario son:

\n
    \n
  • 1 = 0001
  • \n
  • 2 = 0010
  • \n
  • 4 = 0100
  • \n
  • 8 = 1000
  • \n
\n\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".

\n\n

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.

\n\n

¿Para qué sirve [Flags] si puedo simplemente poner números?

\n\n

Sí, 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, Write en lugar del número 3.
  • \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
\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\n

Mejores prácticas para trabajar con [Flags] en 2025

\n\n

1. Usa siempre potencias de dos

\n\n

Esta 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:

\n\n
[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\n

Ten en cuenta: incluye siempre None = 0. Sin él, tu enum por defecto será igual a 0, lo que podría significar "nada seleccionado".

\n\n

2. Usa Enum.HasFlag() — pero con cuidado

Blogs

Book Recommendations