题
我的对象Item
有几个二进制状态,其可被组合
bool CanBeSold;
bool CanBeBought;
bool CanBeExchanged;
我需要值的当前组合存储到一个变量。原因 是,我需要存储在数据库这个值。在C ++中我将创建一个位掩码 其中一个国家占有一定位。它是在.NET中好的做法呢?
解决方案
可以使用枚举与Flags
属性:
[Flags]
enum MyStates {
CanBeSold = 1,
CanBeBought = 2,
CanBeExchanged = 4
}
由于枚举是一体的数据类型下方可以以通常的方式将它们结合起来:
state = MyStates.CanBeSold | MyStates.CanBeExchanged
请注意,这仅当作品枚举值是2的幂(如道格弗格森在指出评论),所以它们可以被容易地组合,并且当多个的设置不重叠。
您也可以定义值作为多个其他值的组合:
CanBeSoldOrBought = CanBeSold | CanBeBought
或
CanBeSoldOrBought = 3
其然后也按预期工作。由此可以看出,例如用于文件的权限,其中读写通常是和写位读的组合。
是的,这是一个相当普遍的做法。框架本身也使用它在几个地方。
在通常的方式检查的特定位被设置,然后
if ((state & MyStates.CanBeSold) != 0) { ... }
其他提示
创建一个枚举其中值对应于位的整数。添加标志属性使您能够对枚举值一些位操作。
[Flags]
public enum CanBe {
Sold = 1,
Bought = 2,
Exchanged = 4
}
现在可以只使用或操作的值之间:
CanBe can = CabBe.Sold | CanBe.Exchanged.
可以与添加的状态| =操作:
can |= CanBe.Sold;
或数个国家:
can |= CanBe.Sold | CanBe.Bought;
可以保持的状态下与所述&=操作者:
can &= CanBe.Sold;
或数个国家:
can &= CanBe.Sold | CanBe.Bought;
可以通过使用〜运算符来创建补的值除去的状态:
can &= ~CabBe.Bough;
或者seveal状态:
can &= ~(CabBe.Bough | CanBe.Exchanged);
可以使用&运算符检查一个状态:
if ((can & CanBe.Sold) != 0) ...
或数个国家一次:
if ((can & (CanBe.Sold | CanBe.Bought)) != 0) ...
或者检查多个州都设置:
if ((can & (CanBe.Sold | CanBe.Bought)) == (CanBe.Sold | CanBe.Bought)) ...
您可以在.NET位掩码也做到这一点。
在你的枚举,你可以定义你的状态作为值
public enum ItemState { CanBeSold = 1; CanBeBought = 2; CanBeExchanged = 4 }
那么你的对象中,你可以做
if (item.State ^ ItemState.CanBeSold) ....
可以使用旗枚举与指定的每个位
[Flags]
enum MyStates {
CanBeSold = 0x1,
CanBeBought = 0x2,
CanBeExchanged = 0x4,
}
MyStates m_Flags;
// to set a flag:
m_Flags |= MyStates.CanBeSold;
// to unset a flag:
m_Flags &= ~MyStates.CanBeSold;
不隶属于 StackOverflow