为什么枚举权限通常具有0,1,2,4的值?
为什么人们总是喜欢用枚举值0, 1, 2, 4, 8
,而不是0, 1, 2, 3, 4
?
这是否与位操作等有关?
我真的很感激一个关于如何正确使用它的小示例代码:)
[Flags]
public enum Permissions
{
None = 0,
Read = 1,
Write = 2,
Delete = 4
}
因为他们是两个权力,我可以这样做:
var permissions = Permissions.Read | Permissions.Write;
也许以后......
if( (permissions & Permissions.Write) == Permissions.Write )
{
// we have write access
}
它是一个位字段,每个设置位对应某个权限(或者任何枚举值逻辑对应)。 如果这些被定义为1, 2, 3, ...
那么您将无法以这种方式使用按位运算符并获得有意义的结果。 深入研究...
Permissions.Read == 1 == 00000001
Permissions.Write == 2 == 00000010
Permissions.Delete == 4 == 00000100
注意这里的模式? 现在,如果我们拿我最初的例子,即,
var permissions = Permissions.Read | Permissions.Write;
然后...
permissions == 00000011
看到? 无论是Read
和Write
位设置,我可以独立检查(另请注意, Delete
位没有设置,因此该值不传达权限删除)。
它允许在一个位的一个字段中存储多个标志。
如果还不清楚其他答案,可以这样想:
[Flags]
public enum Permissions
{
None = 0,
Read = 1,
Write = 2,
Delete = 4
}
只是一个更短的写法:
public enum Permissions
{
DeleteNoWriteNoReadNo = 0, // None
DeleteNoWriteNoReadYes = 1, // Read
DeleteNoWriteYesReadNo = 2, // Write
DeleteNoWriteYesReadYes = 3, // Read + Write
DeleteYesWriteNoReadNo = 4, // Delete
DeleteYesWriteNoReadYes = 5, // Read + Delete
DeleteYesWriteYesReadNo = 6, // Write + Delete
DeleteYesWriteYesReadYes = 7, // Read + Write + Delete
}
有八种可能性,但您可以将它们表示为只有四个成员的组合。 如果有十六种可能性,那么你可以将它们表示为只有五个成员的组合。 如果有四十亿个可能性,那么你可以将它们表示为只有33个成员的组合! 显然,只有33个成员(每个成员除外)都是2的幂,而不是试图在枚举中命名40亿个项目。
由于这些值以二进制表示唯一的位地址:
1 == binary 00000001
2 == binary 00000010
4 == binary 00000100
等等,所以
1 | 2 == binary 00000011
编辑:
3 == binary 00000011
在二进制中3代表在一个地方和两个地方都代表一个值1。 它实际上与值1 | 2
相同 1 | 2
。 所以当你试图用二进制位作为标志来表示一些状态时,3通常是没有意义的(除非有一个逻辑值实际上是两者的组合)
为了进一步说明,你可能想扩展你的示例枚举,如下所示:
[Flags]
public Enum Permissions
{
None = 0, // Binary 0000000
Read = 1, // Binary 0000001
Write = 2, // Binary 0000010
Delete = 4, // Binary 0000100
All = 7, // Binary 0000111
}
因此,我有Permissions.All
,我也隐含有Permissions.Read
, Permissions.Write
和Permissions.Delete