我的对象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的幂时有效(如注释中指出的Doug Ferguson),因此它们可以轻松组合,并且在设置多个时不会重叠。

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

 CanBeSoldOrBought = CanBeSold | CanBeBought


要么

 CanBeSoldOrBought = 3


然后也可以按预期工作。例如,对于文件权限,可以看到这种情况,其中ReadWrite通常是Read和Write位的组合。

是的,这是相当普遍的做法。框架本身也在多个地方使用它。

然后,检查特定位是否被设置的通常方法是

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

10-01 07:10