使用.net下的enum,你可以使用的最大数字是ULong.
这意味着最多64个标志.
当你需要超过64个标志时,会有什么选择?
编辑
对不起,我忘了添加这个,替代方案仍然可以使用按位操作 至少这一个; 和和或.
使用Josh Einstein的建议,我想出了这个,它有意义吗?
class bitArrayFlag
{
private const int flagSize = 255; //allow X numbers of flags
public BitArray flag1;
public BitArray flag2;
public BitArray flagN;
public bitArrayFlag()
{
int flagPos = 0;
bool[] flagBit = new bool[flagSize];
flagBit[flagPos] = true;
flag1 = new BitArray(flagBit);
flagBit[flagPos] = false;
flagPos += 1;
flagBit[flagPos] = true;
flag2 = new BitArray(flagBit);
//...
//...
//...
flagBit[flagPos] = false;
flagPos += 1;
flagBit[flagPos] = true;
flagN = new BitArray(flagBit);
}
}
Run Code Online (Sandbox Code Playgroud)
许多标志似乎过多,并建议重新设计是必要的.但是,您可以考虑使用两组标志.第一个指定"标志组",第二个指定该组中的标志.您必须有一个类,然后管理您的"分组枚举",以便您可以以简单的方式测试是否设置了标志.
struct BigFlags<TGroupEnum, TFlagEnum>
{
private Dictionary<TGroupEnum, TFlagEnum> flags;
public BigFlags(IDictionary<TGroupEnum, TFlagEnum> flags)
{
this.flags = new Dictionary<TGroupEnum, TFlagEnum>(flags);
}
public BigFlags(TGroupEnum group, TFlagEnum flags)
{
this.flags = new Dictionary<TGroupEnum, TFlagEnum>() { { group, flags } };
}
public bool Contains(BigFlags<TGroupEnum, TFlagEnum> flags)
{
// TODO: Compare dictionaries and see if the passed flags are a subset of these flags.
}
// TODO: Equality to check exact match
// TODO: Logical operators and operators for setting/removing flags.
}
Run Code Online (Sandbox Code Playgroud)