用于 FlagsAttribute 和 Enum 的准则
<?XML:NAMESPACE PREFIX = "[default] http://msdn2.microsoft.com/mtps" NS = "http://msdn2.microsoft.com/mtps" />只有要对数值执行按位运算(AND、OR、XOR)时才对枚举使用 FlagsAttribute 自定义特性。
用 2 的幂(即 1、2、4、8 等)定义枚举常量。这意味着组合的枚举常量中的各个标志都不重叠。
请考虑为常用标志组合创建一个枚举常量。例如,如果用于文件 I/O 操作的枚举包含枚举常量 Read = 1 和 Write = 2,请考虑创建枚举常量 ReadWrite = Read OR Write,该常量组合了 Read 和 Write 标志。 此外,在某些情况下,可能会将用于组合标志的按位 OR 运算视为一种高级概念,在简单任务中不需要执行此操作。
测试数值中是否已设置标志的一种简便方法为:在数值和标志枚举常量之间执行按位“与”操作,这种方法会将数值中与标志不对应的所有位都设置为零,然后测试该操作的结果是否等于该标志枚举常量。
将 None 用作值为零的标志枚举常量的名称。 在按位 AND 运算中,不能使用 None 枚举常量测试标志,因为所得的结果始终为零。 但是,您可以在数值与 None 枚举常量之间执行逻辑(不是按位)比较,以确定数值中是否已设置任何位。
如果创建的是值枚举而不是标志枚举,创建 None 枚举常量仍十分有用。 原因是在默认情况下,公共语言运行时会将用于枚举的内存初始化为零。因此,如果不定义值为零的常量,则枚举在创建时将包含非法值。
如果明显存在应用程序需要表示的默认情况,请考虑使用值为零的枚举常量表示默认值。如果不存在默认情况,请考虑使用值为零的枚举常量(这意味着该情况不由任何其他枚举常量表示)。
不要仅为了反映枚举自身的状态而定义枚举值。例如,不要定义仅用于标记枚举末尾的枚举常量。如果需要确定枚举的最后一个值,请显式检查该值。此外,如果枚举常量范围中的所有值都有效,还可以对第一个和最后一个枚举常量执行范围检查。
不要指定保留供将来使用的枚举常量。
在定义采用枚举常量作为值的方法或属性时,应考虑对该值进行验证。原因是即使没有在枚举中定义某个数值,也可以将该数值强制转换为枚举类型。——MSDN
class="csharpcode">using System; /// <summary> /// 节点操作类型 /// </summary> [Flags] public enum NodeType { Root=1, CabsGroupRoot=2, Area=4, Cab=8, Ch=16, OutLine=32, InnerLine=64, OutLineRoot=128, InnnerRoot=256, Pole=512, Lamp=1024, LampGroupRoot=2048, CustomerCategory=4096, None=8192, }
static NodeType InitOpNodeTypes = NodeType.CabsGroupRoot | NodeType.Area | NodeType.Cab | NodeType.CustomerCategory;
判断(黄色背景部分)
CabTreeOperate.ProcessOpNodeStastusImg(tvwCustom.Tree, InitOpNodeTypes, Resource.ok);
public static void ProcessOpNodeStastusImg(TreeList _tree, NodeType _type, Bitmap _bitmap) { foreach (TreeListNode _parentNode in _tree.Nodes) { NodeType _nodeCurretType = (NodeType)_parentNode.Tag; bool _bTypeIsContain = ((_type & _nodeCurretType) != 0);//当前节点类型属于枚举或里面的即{NodeType.CabsGroupRoot | NodeType.Area | NodeType.Cab | NodeType.CustomerCategory} if (_bTypeIsContain) { CrossThreadOperate.InvokeControlAction<TreeList>(_tree, t => { _parentNode.SetValue("OpStatus", _bitmap); t.RefreshNode(_parentNode); } ); }; ProcessPointOpNodeStastusImg(_tree, _parentNode, _type, _bitmap); } }