假设我有这样一个enum:
[Flags]
enum Letters
{
A = 1,
B = 2,
C = 4,
AB = A | B,
All = A | B | C,
}
为了检查AB是否被设置,我可以这样做:
if((letter & Letters.AB) == Letters.AB)
有没有一种比下面更简单的方法来检查是否设置了一个组合标志常量的任何标志?
if((letter & Letters.A) == Letters.A || (letter & Letters.B) == Letters.B)
例如,可以将&与其他东西交换吗?
你可以检查这个值是否不为零。
if ((Int32)(letter & Letters.AB) != 0) { }
但是我认为引入一个值为0的新枚举值并与该枚举值进行比较是更好的解决方案(如果可能的话,因为您必须能够修改枚举)。
[Flags]
enum Letters
{
None = 0,
A = 1,
B = 2,
C = 4,
AB = A | B,
All = AB | C
}
if (letter != Letters.None) { }
更新
看错了问题——修正了第一个建议,忽略第二个建议。
如果你觉得很烦,你可以这样写一个函数:
public bool IsSet(Letters value, Letters flag)
{
return (value & flag) == flag;
}
if (IsSet(letter, Letters.A))
{
// ...
}
// If you want to check if BOTH Letters.A and Letters.B are set:
if (IsSet(letter, Letters.A & Letters.B))
{
// ...
}
// If you want an OR, I'm afraid you will have to be more verbose:
if (IsSet(letter, Letters.A) || IsSet(letter, Letters.B))
{
// ...
}
有两种方法,我可以看到,将工作检查任何位被设置。
阿普罗赫·
if (letter != 0)
{
}
只要你不介意检查所有位,包括未定义的位,这就可以工作!
阿普罗赫·
if ((letter & Letters.All) != 0)
{
}
这只检查定义的位,只要字母。All表示所有可能的位。
对于特定的位(一个或多个集),使用方法B替换字母。所有这些都是你想要检查的(见下文)。
if ((letter & Letters.AB) != 0)
{
}