为什么枚举权限通常具有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

看到? 无论是ReadWrite位设置,我可以独立检查(另请注意, 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.ReadPermissions.WritePermissions.Delete

链接地址: http://www.djcxy.com/p/54449.html

上一篇: Why do enum permissions often have 0, 1, 2, 4 values?

下一篇: c# flag comparison "only contain" a set