我想写下面的内容......
bool hasAnyInvalid = false;
hasAnyInvalid |= IsValidType1(...);
hasAnyInvalid |= IsValidType2(...);
hasAnyInvalid |= IsValidType3(...);
hasAnyInvalid |= IsValidType4(...);
if (hasAnyInvalid){ return false; }
据我所知,上述情况将失败,因为true |真是假。
如何使用一个布尔变量来测试多个函数的假?
我需要评估每个IsValidType函数。所以我不能将其短路。
基本上,我想要一个逻辑门,一旦它成为现实,它就会成立。我似乎记得在过去的C ++中使用HRESULT返回时这样做,但我们可能只是将严重性的整数值相加。
我愿意接受其他解决方法。
编辑: 我对这个问题表达不好,并且包含了一些逻辑错误(我打算把它写成异或)。 我将在上面留下我原来的问题,因为人们特别评论了它,我讨厌改变历史。
答案 0 :(得分:6)
如果您想检测单个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;
}
答案 1 :(得分:4)
函数返回false。
true
请注意,读取就像您的要求一样:如果任何结果为bool[] results = new[] {
IsValidType1(),
IsValidType2(),
IsValidType3(),
IsValidType4()
};
return results.Any(b => !b);
,则返回true
。
我需要评估每个IsValidType函数。所以我不能将其短路。
这必须意味着这些功能具有您需要观察的副作用。只需确保您记录您的代码,以便没有人看到这一点,并且没有意识到将其更改为短路功能评估可能会通过消除副作用来引入错误。
据我所知,上述内容将失败,因为
false
为true | true
。
我不确定是什么让你这么想的。 false
,true | true
是true or true
。您可能正在考虑true
,但这将是xor
。
答案 2 :(得分:1)
您的代码存在的问题是,当函数检查有效性时,您的变量标记无效。
您可以更改每个IsValid
来电的返回值,使其回答问题IsInvalid
。
只需在每次!
来电之前添加IsValid
即可。
代码如下所示:
bool hasAnyInvalid = false;
hasAnyInvalid |= !IsValidType1(...);
hasAnyInvalid |= !IsValidType2(...);
hasAnyInvalid |= !IsValidType3(...);
hasAnyInvalid |= !IsValidType4(...);
return hasAnyInvalid;
答案 3 :(得分:-1)
您无需编写以下内容即可使用变量:
private bool IsValidForAllTypes(...)
{
return IsValidType1(...) & IsValidType2(...) & IsValidType3(...) & IsValidType4(...);
}