4

我想写一些类似下面的东西......

bool hasAnyInvalid = false;
hasAnyInvalid |= IsValidType1(...);
hasAnyInvalid |= IsValidType2(...);
hasAnyInvalid |= IsValidType3(...);
hasAnyInvalid |= IsValidType4(...);

if (hasAnyInvalid){ return false; }

据我所知,以上将失败,因为 true | 真就是假。

如何使用一个布尔变量来测试多个函数是否为假?

我需要评估每个 IsValidType 函数。所以我不能把它短路。

基本上,我想要一个逻辑门,一旦它变为真,它就会保持真实。我似乎记得过去在 C++ 中使用 HRESULT 返回执行此操作,但我们可能只是将严重性的整数值相加。

我对解决这个问题的其他方法持开放态度。

编辑:我对这个问题的措辞很糟糕,并且包括了一些逻辑混乱(我的意思是把它写成 XOR )。我将把我原来的问题留在上面,因为人们特别评论了它,我讨厌改变历史。

4

4 回答 4

7

如果要检测单个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;
}
于 2013-07-12T13:10:19.653 回答
4

不会缩短函数对其值的评估,并且true如果任何函数返回 false,则将返回。

bool[] results = new[] {
    IsValidType1(),
    IsValidType2(),
    IsValidType3(),
    IsValidType4() 
};
return results.Any(b => !b);

请注意,它读起来像您的要求:true如果任何结果为false.

我需要评估每个 IsValidType 函数。所以我不能把它短路。

这一定意味着这些函数具有您需要观察的副作用。只要确保您记录了您的代码,以便没有人看到这一点并且没有意识到将其更改为短路函数评估可能会通过消除副作用来引入错误。

据我所知,以上将失败,因为true | trueis false

我不确定是什么让你这么想。true | true,即true or truetrue。你可能会想到xor,但那会是true ^ true

于 2013-07-12T13:15:11.867 回答
1

您的代码的问题是您的变量在函数检查有效性时标记无效。您可以更改每个调用的返回值IsValid以使其回答问题IsInvalid。只需!在每次IsValid通话前添加一个。代码如下所示:

bool hasAnyInvalid = false;
hasAnyInvalid |= !IsValidType1(...);
hasAnyInvalid |= !IsValidType2(...);
hasAnyInvalid |= !IsValidType3(...);
hasAnyInvalid |= !IsValidType4(...);

return hasAnyInvalid;
于 2013-07-12T13:23:02.607 回答
-1

不需要变量,您只需编写以下内容:

private bool IsValidForAllTypes(...)
{
   return IsValidType1(...) & IsValidType2(...) & IsValidType3(...) & IsValidType4(...);
}
于 2013-07-12T13:21:18.920 回答