Enum 似乎是用来创建标志的。把枚举值翻译成二进制可以看得更清楚:
public enum PrivilegeFlags : int
{
None = 0, //0000 0000
[EnumMember(Value = "Agent")]
Agent = 1 << 0, //0000 0001
[EnumMember(Value = "Campaign")]
Campaign = 1 << 1, //0000 0010
[EnumMember(Value = "BlackList")]
BlackList= 1 << 2, //0000 0100
All = (1 << 3) - 1 //0000 0111
}
而EnumMember 是分配给PrivilegeFlags enum 成员的属性。
你不需要声明enum如下所示是等效的枚举:
public enum PrivilegeFlags : int
{
None = 0, //0000 0000
[EnumMember(Value = "Agent")]
Agent = 1, //0000 0001
[EnumMember(Value = "Campaign")]
Campaign = 2, //0000 0010
[EnumMember(Value = "BlackList")]
BlackList= 4, //0000 0100
All = 7 //0000 0111
}
1 << 1 表示您的值为1,并且您将1 的二进制左移到1 的值。在二进制层面上看得很清楚:
0000 0001 //1 in binary
--------- << 1 shift left by 1
0000 0010 //note the binary shift, now this is actually 2
使用指定的左移<< 的好处是使标志创建具有递增编号:0, 1, 2, 3, 4, ... 等,而不是具有2^n 和0 模式中的编号:0, 1, 2, 4, 8, ...