[英]C# and flags/bit tests - “Except if” - … how to?
标题杂乱无章,但在尝试寻找一种“漂亮”(=易于读取且易于维护)的方法来找出以简单的方式执行类似操作的方式时,我的大脑却无济于事:
[Flags]
enum SomeFlags {
_unset_ = 0,
SomeFlag = 1 << 1,
ExceptionalFlag = 1 << 16,
}
private SomeFlags someenum = SomeFlags._unset_;
...
int times = 1;
while(times > 0)
{
times--;
...
rnd_num = /*make random number in range X to Y*/ fooRandom();
...
if (rnd_num <= arbitrary_const &&
( !someenum.HasFlag(Flags.SomeFlag)
[[except if]]
somenum.HasFlag(Flags.ExceptionalFlag) )
)
{
/* do stuff if numeric condition matches, AND someenum does
-not- contain SomeFlag, EXCEPT if someenum has -also-
ExceptionalFlag set alongside SomeFlag */
}
else if (...yaddayadda...)
...
else {
times++;
someenum |= SomeFlags.ExceptionalFlag;
continue;
}
break;
}
也许?:
if ( /* some_numeric_condition == */ true &&
(!someenum.HasFlag(Flags.SomeFlag) ||
someenum.HasFlag(Flags.SomeFlag | Flags.ExceptionalFlag) ) )
{ /* foobar */ }
有没有任何一种“更简单”的表达方式? 只是让我头脑清醒,因为这种测试埋在很多代码的后面/之中,而我对“单元测试”一词还不熟悉。
寻求真相表:
SomeFlag SomeFlag|ExceptionalFlag True?
0 0 true
1 0 false
0 1 false
1 1 true
编辑:澄清一点(我希望)-如果东西在循环中,在这种情况下……条件会改变。
edit2:为真值表编辑……寻求解决,然后-再来#3!
如果您正在寻找与您已有的代码更短的代码,因为这似乎与您的描述相符,则可以尝试
!(someenum.HasFlag(Flags.SomeFlag) && !someenum.HasFlag(Flags.ExceptionalFlag))
它遇到了
除非设置了
SomeFlag
设置ExceptionalFlag
而不是你原来的
如果未设置
SomeFlag
或同时设置了两个标志
它实际上并不太短或更清晰,只是一种不同的查看方式。
您的摘要:
(!someenum.HasFlag(Flags.SomeFlag)
|| someenum.HasFlag(Flags.SomeFlag | Flags.ExceptionalFlag) )
事实证明完全等同于:
!someenum.HasFlag(Flags.SomeFlag) || someenum.HasFlag(Flags.ExceptionalFlag)
无需指定设置了SomeFlag
因为我们已经证明了输入第二项检查不是这样。
这是真值表:
SomeFlag ExceptionalFlag Expected Result 0 0 1 0 1 1 1 0 0 1 1 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.