Porque eles são poderes de dois e eu posso fazer isso:
var permissions = Permissions.Read | Permissions.Write;
E talvez mais tarde ...
if( (permissions & Permissions.Write) == Permissions.Write )
{
// we have write access
}
É um campo de bits, em que cada bit definido corresponde a alguma permissão (ou seja qual for o valor logicamente correspondente). Se eles fossem definidos, 1, 2, 3, ...
você não seria capaz de usar operadores bit a bit dessa maneira e obter resultados significativos. Para aprofundar ...
Permissions.Read == 1 == 00000001
Permissions.Write == 2 == 00000010
Permissions.Delete == 4 == 00000100
Observe um padrão aqui? Agora, se pegarmos meu exemplo original, ou seja,
var permissions = Permissions.Read | Permissions.Write;
Então...
permissions == 00000011
Vejo? Os bits Read
e Write
estão definidos, e posso verificar isso independentemente (observe também que o Delete
bit não está definido e, portanto, esse valor não transmite permissão para excluir).
Ele permite armazenar vários sinalizadores em um único campo de bits.