quarta-feira, março 26, 2008

Atributo Flag num enum

Por vezes é interessante poder combinar num campo combinações de um enumerado, isso pode ser conseguido à custa do atributo Flag. Primeiro vou mostrar o exemplo sem o atributo e depois com o atributo.
public enum TournamentMode {
    Uefa,
    Champions,
    Groups,
    Eliminatory
};

public class Tournament
{
  TournamentMode championship = TournamentMode.Champions;
  TournamentMode fase = TournamentMode.Groups;
  [...]
}
Neste caso preciso de ter dois campos na classe um para representar o tipo de taça e outro para representar a fase em que se vai no torneio, o exemplo seguinte combina os atributos num só campo.
[Flag]
public enum TournamentMode {
    Uefa,       //0001
    Champions,  //0010
    Groups,     //0100
    Eliminatory //1000
};

public class Tournament
{
  TournamentMode info = TournamentMode.Champions | TournamentMode.Groups; //0110
  [...]
}
Ao acrescentar o atributo Flag cada valor do enumerado passa a ser representado por um bit, ou seja, é possível fazer combinações e testar essas combinações como se tivessemos a fazer ands e ors bit a bit.

bool isInGroup = info == TournamentMode.Groups;

5 comentários:

Anónimo disse...

Um belo post!

Devo dizer que, analisando com cuidado, creio que no teu caso deverias ter 2 enumerados, dado que o tipo de torneio e a fase em que se encontra representam dois elementos distintos.

De qualquer modo, bela dica =)

Luís Miguel Silva disse...

Boa dica ;o)

Hugz,
Luís

Tiago Sousa disse...

Olá Caxaria, ao tempo que não sabia nada de ti. O exemplo até é pouco adequado, só que onde eu utilizei esta técnica num código bastante mais complexo, e então arranjei este exemplo meio "à pressão" só como demonstração.
Luís, não sei se te conheço porque conheço alguns Luíses não sei se te incluis no grupo, mas obrigado na mesma :)

Anónimo disse...

Pois, agora ando a trabalhar como consultor em Inglaterra... tenho sabido pouco do pessoal em Portugal... mas mantenho o teu blog debaixo de olho ;)

E tu, como corre a vida?

Abraços de um ex-medialogense para outro ;)

Anónimo disse...

A utilização de atributos no mundo .NET permite acrescentares informação à metadata gerada para a tua aplicação.

Na minha opinião o exemplo que apresentas permite demonstrar com sucesso a agilidade do atributo Flag em acção.

Nice one.