With enum under .net the biggest number you can use is ULong.
This mean a maximum of 64 flags.
What would be the alternative when you need more than 64 flags?
Edit
Sorry, I forgot to add this, alternative that would still work with bitwise operations at least these one; and and or.
using Josh Einstein suggestion, I came up with this, does it make sense?
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);
}
}
We use the values 0, 1, 2, 4 to indicate the underlying bits for each value—we should double each value to avoid conflicts. Operators We use bitwise operators, like OR and AND, with enum flags. We use "NOT" to remove a flag from an enum.
The [Flag] attribute is used when Enum represents a collection of multiple possible values rather than a single value. All the possible combination of values will come. The [Flags] attribute should be used whenever the enumerable represents a collection of possible values, rather than a single value.
Flags allow you to use bitmasking inside your enumeration. This allows you to combine enumeration values, while retaining which ones are specified.
In general, "Flag" is just another term for a true/false condition. It may have more specific meanings in more specific contexts. For instance, a CPU may keep "arithmetic flags", each one indicating a true/false condition resulting from the previous arithmetic operation.
That many flags seems excessive and would suggest a redesign is needed. However, you could consider using two sets of flags. The first to designate the "flag group" and the second to designate the flags within that group. You'd have to have a class that then managed your "grouped enum" so that you could test if a flag was set or not in a simple way.
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.
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With