我想写下面这样的东西......
bool hasAnyInvalid = false;
hasAnyInvalid |= IsValidType1(...);
hasAnyInvalid |= IsValidType2(...);
hasAnyInvalid |= IsValidType3(...);
hasAnyInvalid |= IsValidType4(...);
if (hasAnyInvalid){ return false; }
据我所知,上述内容将失败,因为 true | true 就是 false。
如何使用一个布尔变量来测试多个函数的假数?
我需要评估每个 IsValidType 函数。所以我不能短路。
基本上,我想要一个逻辑门,一旦它成真,它就会保持真实。我似乎记得过去在 HRESULT 返回C++这样做,但我们可能只是将严重性的整数值相加。
我对解决这个问题的其他方法持开放态度。
编辑:我对这个问题的措辞很糟糕,并且包括一些逻辑混乱(我的意思是将其写为 XOR(。我将把我原来的问题留在上面,因为人们特别评论了它,我讨厌改变历史。
如果要检测单个false
,则需要使用&
,而不是|
:
bool allValid = true; // Start it with "true"
allValid &= IsValidType1(...); // The first "false" will make "allValid" false
allValid &= IsValidType2(...);
allValid &= IsValidType3(...);
allValid &= IsValidType4(...);
if (!allValid) { // Invert "allValid" before returning
return false;
}
这不会缩短函数值的计算,如果任何函数返回 false,则将返回true
。
bool[] results = new[] {
IsValidType1(),
IsValidType2(),
IsValidType3(),
IsValidType4()
};
return results.Any(b => !b);
请注意,它读起来就像您的要求:如果false
任何结果,则返回true
。
我需要评估每个 IsValidType 函数。所以我不能短路。
这必须意味着这些函数具有您需要观察的副作用。只要确保你记录了你的代码,这样就不会有人看到这一点,也没有意识到改变它以缩短函数评估可能会通过消除副作用引入错误。
据我所知,以上内容会失败,因为
true | true
false
.
我不确定是什么让你这么想。 true | true
,即true or true
是true
。您可能会想到xor
,但那将true ^ true
。
代码的问题在于,当函数检查有效性时,变量会标记无效。您可以更改每个IsValid
调用的返回值,使其回答问题IsInvalid
。只需在每次IsValid
呼叫前添加一个!
即可。代码如下所示:
bool hasAnyInvalid = false;
hasAnyInvalid |= !IsValidType1(...);
hasAnyInvalid |= !IsValidType2(...);
hasAnyInvalid |= !IsValidType3(...);
hasAnyInvalid |= !IsValidType4(...);
return hasAnyInvalid;
不需要变量,只需编写以下内容:
private bool IsValidForAllTypes(...)
{
return IsValidType1(...) & IsValidType2(...) & IsValidType3(...) & IsValidType4(...);
}