In. NET, enumeration is generally used in two ways. One is to represent a unique sequence of elements, such as days in a week, and the other is to represent a variety of composite states. In this case, you need to add the [Flags] feature to the enumeration to mark it as a bit field, for example, [Flags].
Enum Styles {
ShowBorder = 1, // whether to display the border
ShowCaption = 2, // whether to display the title
ShowToolbox = 4 // whether to display the toolbox
}
In this way, we can combine multiple states with the "or" operator, for example
MyControl. Style = Styles. ShowBorder | Styles. ShowCaption;
In this case, the value of myControl. Style enumeration will be 1 + 2 = 3, and its ToString () will be changed to "Styles. ShowBorder, Styles. ShowCaption"
Here we can explain why the third value ShowToolbox can be 4, 5... but not 3. That is to say, its value should not be the compound value of the previous values. One simple method is to assign values to each item in turn using the N power of 2, for example, 1, 2, 4, 8, 16, 32, 64 .....
Here is a common example of the Flags application. For example, a simple permission system has two roles: "Admin" and "User". We can put a varchar () field in the table and store the permission word "Admin, user ". However, if the Flags type is used for enumeration, we can directly put the value of Roles. Admin | Roles. User in an int field.
The following are some common enumeration operations:
Change the enumerated value back to the enumerated object:
Styles style = (Styles) Enum. Parse (typeof (Styles), 4 );//-> Style = Styles. Toolbox;
Check whether the enumeration contains an element:
Bool hasFlag = (style & Styles. ShowBorder )! = 0 );
In fact, we also encounter a situation where we need to remove an element from the combination state. You can use the "^" operator:
Styles style = Styles. ShowBorder | Styles. ShowCaption;
Style = style ^ Styles. ShowBorder;
In this case, the value of the style changes to Styles. ShowCaption.
But here is a very serious problem (I have discovered it now)
We will execute it again at this time.
Style = style ^ Styles. ShowBorder;
According to our ideas, the style value is Styles. ShowCaption, which does not contain Styles. ShowBorder. Therefore, even if we remove this element, the style will not change. However, the actual style value is changed to Styles. ShowBorder | Styles. ShowCaption !! If you execute the statement again, the element is removed and the task starts again and again.
Of course, we can check before removing an element. If the enumeration contains this element, remove it:
If (style & Styles. ShowBorder )! = 0 ){
Style = style ^ Styles. ShowBorder;
}
I don't know if there are other methods to easily remove an element from the Flags enumeration state ..
Thanks to mobilebilly:
Style = style &(~ Styles. ShowBorder) to remove an element.
This article goes to http://blog.csdn.net/collinye/archive/2008/10/07/3027536.aspx