如何在一个变量中存储多个状态?

时间:2009-12-06 12:08:12

标签: c# design-patterns bitmask

我的对象Item有几个可以合并的二进制状态

bool CanBeSold;
bool CanBeBought;
bool CanBeExchanged;

我需要将当前的值组合存储到一个变量中。原因 是我需要将此值存储在DB中。在C ++中,我会创建一个位掩码 一个州占据一点点的地方。这是.NET中的好习惯吗?

4 个答案:

答案 0 :(得分:13)

您可以使用Flags属性的枚举:

[Flags]
enum MyStates {
  CanBeSold = 1,
  CanBeBought = 2,
  CanBeExchanged = 4
}

由于枚举是下面的整数数据类型,因此可以通常的方式组合它们:

state = MyStates.CanBeSold | MyStates.CanBeExchanged

请注意,这只适用于枚举值为2的幂(在注释中指出为Doug Ferguson),因此它们可以轻松组合,并且在设置多个时不会重叠。

您还可以将值定义为多个其他值的组合:

 CanBeSoldOrBought = CanBeSold | CanBeBought

 CanBeSoldOrBought = 3

然后也按预期工作。例如,对于文件权限,可以看到这一点,其中ReadWrite通常是读和写位的组合。

是的,这是一种很常见的做法。框架本身也在几个地方使用它。

检查所设置的特定位的常用方法是

if ((state & MyStates.CanBeSold) != 0) { ... }

答案 1 :(得分:7)

创建一个枚举,其中值对应于整数中的位。添加Flags属性使您可以对枚举值执行更多位操作。

[Flags]
public enum CanBe {
  Sold = 1,
  Bought = 2,
  Exchanged = 4
}

现在你可以在值之间使用or运算符:

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);

您可以使用&amp ;;检查状态。操作者:

if ((can & CanBe.Sold) != 0) ...

或者几个州立刻:

if ((can & (CanBe.Sold | CanBe.Bought)) != 0) ...

或检查是否已设置多个状态:

if ((can & (CanBe.Sold | CanBe.Bought)) == (CanBe.Sold | CanBe.Bought)) ...

答案 2 :(得分:2)

你也可以在.NET中使用位掩码。

在枚举中,您可以将状态定义为值

public enum ItemState { CanBeSold = 1; CanBeBought = 2; CanBeExchanged = 4 }

然后在你的对象中,你可以做到

if (item.State ^ ItemState.CanBeSold) ....

答案 3 :(得分:2)

您可以对指定的每个位使用Flags枚举

[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;