枚举类型一般情况下多作为描述性质的参数,我们可以组合不同的属性到枚举之中,而且可以很容易地从枚举对象中读取出是否包含指定的参数(开关)。
枚举参数的好处是可以将多个选项值存放到一个变量之中,减少存储空间。
因为在.NET中,一个布尔值(Boolean)就占用4字节,而一个四字节的Integer可以存储高达32个选项开关!

那么如何定义一个枚举参数呢?这里只有一个最简单的定律,那就是乘2。
比如基础参数为1,那么第二个参数就是2,第三个就是4,之后以此类推即可。
这种方法采用的是二进制的位移原理,只要乘2便可定位到下一个开关位置。
你也可以直接使用位移操作符<<来设置参数的数值,下面有演示代码。

一个枚举模型
<Flags()> _
Enum flags
    none = 0
    f1 = 1 << 0 '1
    f2 = 1 << 1 '2
    f3 = 1 << 2 '4
    f4 = 1 << 3 '8
    f5 = 1 << 4 '16
    f6 = 1 << 5 '32
    f7 = 1 << 6 '64
    f8 = 1 << 7 '128
End Enum
检测方法也很简单,我们可以在 VB 中使用 Or 来将开关组合到一起,判断时将参数与你的预期数值进行 And 合取,返回的数值如果等于预期值,那么便表示所有的参数都一致!

判断是否包含指定的参数(开关)
Shared Function checkFlag(ByVal value As Integer, ByVal flags As Integer) As Boolean
    Return (value And flags) = flags
End Function
演示代码
Dim f As flags = flags.f1 Or flags.f8

checkFlag(f, flags.f1) 'true
checkFlag(f, flags.f2) 'false
checkFlag(f, flags.f8) 'true
checkFlag(f, flags.f8 Or flags.f1) 'true
checkFlag(f, flags.f8 Or flags.f3) 'false
checkFlag(f, flags.f8 Or flags.f1 Or flags.f3) 'false