我的对象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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top