如何在C#中避免短路求值,同时实现相同的功能

15

在C#中是否有任何运算符可以避免短路评估并遍历所有条件。

比如说

if(txtName.Text.xyz() || txtLastName.Text.xyz())
{

}

public static bool xyz(this TextBox txt)
{
//do some work.
return false;
}
它应该评估所有条件,而不管获得的输出如何。在评估完最后一个条件后,根据所获得的结果继续执行。?

为什么要两次评估相同的条件? - Adrian Grigore
1
@Adrian:把它当作一个样例。xyz函数可能包含任何类型的定义,可以是委托或其他内容。 - Shantanu Gupta
2个回答

27

只需使用单个竖杠,这将评估两个参数,而不管第一个结果的结局如何。

if(txtName.Text.xyz() | txtLastName.Text.xyz()) { }

你也可以使用 AND 来实现同样的效果,即用单个 & 符号替换 &&

if(txtName.Text.xyz() & txtLastName.Text.xyz()) { } // Both sides will be called

1
抱歉打扰,但这不是正确的方法。这是调用另一个操作,即按位与/或,需要第二个函数执行才能返回适当的值。如果您返回某些数字值,这会导致奇怪的结果。 - Benny Mackney
@BennyMackney有示例吗? - djdd87
像这样做var a = funcA(); var b = funcB(); if(a || b)将使你的意图更加清晰。如果你使用单符号版本(按位与/或),你会得到奇怪的结果,特别是在和(&)的情况下。例如,(4&8) == 0,这是错误的,而4 && 8是正确的。现在C#已经停止了这个行为(因为你正在将int转换为bools而没有明确地进行强制转换),但其他语言(如Javascript)将以不同的方式运作。例如,在我的JS控制台中:if(4&8){console.log('this should exec right?');}else if(4&&8){console.log("Wrong!");} VM321:1 Wrong! - Benny Mackney
5
@BennyMackney 这是一道C#问题。原帖问如何在if语句中同时调用两个方法,这个回答满足了需求。虽然这个回答是正确的,但我同意这不是最佳实践。最佳实践是先分别调用两个方法以便提高代码可读性,然后再将它们的结果组合到if语句中。即 bool answerA = funcA(); bool answerB = funcA(). if (answerA && answerB){ // 做一些事情 }。 - djdd87
我知道。但是JavaScript也被提到了,而且这只是一条评论,不是一个实际的答案,所以我在更广泛的意义上说话。 - Benny Mackney
1
这正是我所需要的。鉴于@BennyMackney似乎没有任何理由不喜欢这种方法(除了在另一种无关语言中),我将使用它! - Daniel

7
只需使用单栏。
if(txtName.Text.xyz() | txtLName.Text.xyz())
{

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接