繁体   English   中英

C#和标志/位测试-“除外”-……如何?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM