Побитовые операции - отличный способ быстро проверить флаг, который может быть установлен для переменной.
В следующем примере подчеркиваются преимущества использования побитовых операций при перечислении Flag
, а также сохранения битового поля в базе данных. Затем можно легко проверить битовое поле, чтобы увидеть, содержит ли оно одно значение или подмножество значений из перечисления Flag
.
Пример:
A User
таблица базы данных с полем tinyint
с именем Permission
. Поле заполняется с использованием значения, созданного с помощью перечисления, значения которого равны 2 ^ n.
[Flags]
public enum Permission : byte
{
None = 0,
ManageUsers = 1 << 0,
CreateOrders = 1 << 1,
PurchaseEquipment = 1 << 2,
CancelOrders = 1 << 3,
}
Помимо побитовых операций, используемых для указания значений в перечислении (выполняется во время компиляции), вы можете использовать перечисление, чтобы проверить, содержит ли поле «Разрешение» в базе данных какое-либо подмножество возможных значений. Со стороны базы данных вы получаете возможность складывать значения в одно поле - устраняя необходимость иметь столбец для каждого разрешения, а на стороне кода вы получаете простой способ проверки значения.
Пример работы с битами (Grant ManageUsers и CreateOrders):
Permission userPermissions = Permission.ManageUsers | Permission.CreateOrders;
Пример проверки прав:
public bool HasPermissions(Permission userPermissions, Permission permissionsToCheckFor)
{
return permissionsToCheckFor == Permission.None ?
false :
(userPermissions & permissionsToCheckFor) == permissionsToCheckFor;
}