C# Tips & Tricks – Enum.HasFlag

Na versão 4.0 do .NET Framework temos como novidade a possibilidade de utilizar o método HasFlag em enumerações que possuem o atributo FlagsAttribute, ou seja, enumerações que representam combinações de bits. Esse método é bastante útil, já que não é mais necessário verificar se um flag existe na enumeração usando o operador & (AND).

Para demonstrar como esse método nos ajuda, vou utilizar e enumeração FileAttributes (System.IO) que fornece atributos de arquivos e pastas.

Podemos verificar na documentação que essa enumeração possui o atributo FlagsAttribute.

[SerializableAttribute]
[FlagsAttribute]
[ComVisibleAttribute(true)]
public enum FileAttributes

Vamos criar uma instância dessa enumeração tentando recuperar os atributos existentes na pasta C:\Windows\Temp. Para isso, podemos utilizar o método estático GetAttributes da classe File.

var fileAttributes = File.GetAttributes(@"C:\Windows\Temp\");

Obs.: Não confunda os atributos do .NET, que são um mecanismo de atribuição de informação adicional em tipos e membros, com os atributos dos arquivos e pastas que são propriedades associadas a estes pelo sistema operacional.

Nas versões anteriores, se quiséssemos verificar se o arquivo (File) possui o flag FileAttributes.Directory por exemplo, o código ficaria assim:

if ((fileAttributes & FileAttributes.Directory) == FileAttributes.Directory)
    Console.WriteLine("É uma pasta...");

Com a adição do método HasFlag, o código anterior pode ser feito tal como abaixo.

if (fileAttributes.HasFlag(FileAttributes.Directory))
    Console.WriteLine("É uma pasta...");

É uma maneira mais simples e acho que também um código um pouco mais elegante.

O único inconveniente é que o método HasFlag possui como parâmetro um tipo System.Enum, não sendo possível pelo Visual Studio “adivinhar” (realizar type inference) e sugerir um flag da enumeração enquanto digitamos o código.

Até a próxima.

Enum.HasFlag
http://bit.ly/ceG0ls

FlagsAttribute Class
http://bit.ly/bfTdyP

FileAttributes Enumeration
http://bit.ly/9xZW79

Nenhum comentário:

Postar um comentário