哪家网站开发公司好,上海本地网站建设,wordpress 慢,徐州seo前言
学习前需要了解位运算相关知识点。位运算介绍
Flags
标记可将枚举视为位域。
以下示例演示了FlagsAttribute特性的使用#xff0c;并演示了对声明使用 [Flags] 后对 ToString 方法的影响。 // Define an Enum without FlagsAttribute.enum SingleHue : short{None 0…前言
学习前需要了解位运算相关知识点。位运算介绍
Flags
标记可将枚举视为位域。
以下示例演示了FlagsAttribute特性的使用并演示了对声明使用 [Flags] 后对 ToString 方法的影响。 // Define an Enum without FlagsAttribute.enum SingleHue : short{None 0,Black 1,Red 2,Green 4,Blue 8};// Define an Enum with FlagsAttribute.[Flags]enum MultiHue : short{None 0,Black 1,Red 2,Green 4,Blue 8};static void Main( ){// Display all possible combinations of values.Console.WriteLine(All possible combinations of values without FlagsAttribute:);for(int val 0; val 16; val )Console.WriteLine( {0,3} - {1:G}, val, (SingleHue)val);// Display all combinations of values, and invalid values.Console.WriteLine(\nAll possible combinations of values with FlagsAttribute:);for( int val 0; val 16; val )Console.WriteLine( {0,3} - {1:G}, val, (MultiHue)val);}
// The example displays the following output:
// All possible combinations of values without FlagsAttribute:
// 0 - None
// 1 - Black
// 2 - Red
// 3 - 3
// 4 - Green
// 5 - 5
// 6 - 6
// 7 - 7
// 8 - Blue
// 9 - 9
// 10 - 10
// 11 - 11
// 12 - 12
// 13 - 13
// 14 - 14
// 15 - 15
// 16 - 16
//
// All possible combinations of values with FlagsAttribute:
// 0 - None
// 1 - Black
// 2 - Red
// 3 - Black, Red
// 4 - Green
// 5 - Black, Green
// 6 - Red, Green
// 7 - Black, Red, Green
// 8 - Blue
// 9 - Black, Blue
// 10 - Red, Blue
// 11 - Black, Red, Blue
// 12 - Green, Blue
// 13 - Black, Green, Blue
// 14 - Red, Green, Blue
// 15 - Black, Red, Green, Blue
// 16 - 16我们可以发现3在转SingleHue后还是3但是在转MultiHue后变为了Black|Red也就是说使用了位运算。
加了 [Flags] 特性后有三种写法一种是使用符号第二种是0x01, 还有一种是直接写01248…一般来说是2的n次方来表示。 ///summary/// 权限枚举////summary[Flags]public enum permission { Unknown 0; // 也可以写成0x00或0 Create 10, // 0x01或1 Read 11, //0x02或2Update 12, //0x04或4Delete 13 //0x08或8}对于位运算的应用
//1、给用户创建、读取修改和删除的权限
var permission permission.Create | permission.Read | permission.Update | permission.Delete;//2、去掉用户的修改和删除权限
permission permission~permission.Update;
permission permission~permission.Delete;//3、给用户加上修改的权限
permission permission | permission.Update;//4、判断用户是否有创建的权限
var isCreate (permission permission.Create)!0;
//或者
var isCreate (permission permission.Create)permission.Create;这时permission枚举的值将变成0145它的ToSting()将变成“permission.Createpermission.Read,permission.Update” 这里我们可以解释为什么第五个值Delete是8而不能成为5。也就是说它的值不应该是前几项值的复合值。一个比较简单的方法就是用2的n次方来依次位每一项赋值例如1248163264…。
Enum.HasFlag(Enum)
确定当前实例中是否设置了一个或多个位域。 示例
[Flags]
public enum DinnerItems {None 0,Entree 1,Appetizer 2,Side 4,Dessert 8,Beverage 16,BarBeverage 32
}public class Example
{public static void Main(){DinnerItems myOrder DinnerItems.Appetizer | DinnerItems.Entree |DinnerItems.Beverage | DinnerItems.Dessert;DinnerItems flagValue DinnerItems.Entree | DinnerItems.Beverage;Console.WriteLine({0} includes {1}: {2},myOrder, flagValue, myOrder.HasFlag(flagValue));}
}
// The example displays the following output:
// Entree, Appetizer, Dessert, Beverage includes Entree, Beverage: True直白来说就是判断该值是否包含传入的枚举。
注意事项
需要注意如果传入HasFlag方法中的值为0那么会始终返回true这种情况需要 Equals 方法或 CompareTo 来判断。 如果枚举值是从非0开始就不用考虑这个问题如1、2、4、8…