按位运算是快速检查可能在变量上设置的标志的好方法。
以下示例突出了对Flag 枚举使用按位运算以及将位填充字段存储到数据库中的好处。然后可以轻松地检查 bitstuffed 字段以查看它是否包含来自 Flag 枚举的单个值或值的子集。
示例:
一个 User 数据库表,其中包含一个名为 Permission 的 tinyint 字段。该字段使用枚举创建的值填充,其值为 2^n。
[Flags]
public enum Permission : byte
{
None = 0,
ManageUsers = 1 << 0,
CreateOrders = 1 << 1,
PurchaseEquipment = 1 << 2,
CancelOrders = 1 << 3,
}
除了用于在枚举中指定值的按位运算(在编译时完成)之外,您还可以使用枚举来检查数据库中的 Permission 字段是否包含任何可能值的子集。从数据库方面,您可以将值填充到单个字段中 - 无需为每个权限设置一列,并且在代码方面,您可以获得检查值的简单方法。
位填充示例(授予 ManageUsers 和 CreateOrders):
Permission userPermissions = Permission.ManageUsers | Permission.CreateOrders;
权限检查示例:
public bool HasPermissions(Permission userPermissions, Permission permissionsToCheckFor)
{
return permissionsToCheckFor == Permission.None ?
false :
(userPermissions & permissionsToCheckFor) == permissionsToCheckFor;
}