在执行相同功能时如何避免 C# 中的短路评估

Posted

技术标签:

【中文标题】在执行相同功能时如何避免 C# 中的短路评估【英文标题】:How to avoid short circuit evaluation in C# while doing the same functionality 【发布时间】:2011-03-15 17:33:39 【问题描述】:

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

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




public static bool xyz(this TextBox txt)

//do some work.
return false;

它应该评估所有条件,而不考虑获得的输出。并在评估最后一个条件后根据获得的结果继续。 ?

【问题讨论】:

为什么要对同一个条件进行两次评估? @Adrian:以它为例。 xyz 函数可以包含任何类型的定义,可以是委托或其他。 【参考方案1】:

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

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

您也可以使用 AND 执行相同的操作,即您可以将 && 替换为单个 & 以获得与上述相同的效果:

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

【讨论】:

对 necropost 感到抱歉,但这不是正确的做法。这是调用不同的操作,按位和/或,它确实需要执行第二个函数以返回适当的值。如果您返回某些数值,这会导致奇怪。 @BennyMackney 有例子吗? 做类似 var a = funcA(); var b = funcB(); if(a || b) 会让你想做什么更清楚。如果您使用单个符号版本(按位和/或)执行此操作,您会感到奇怪,尤其是使用 and (&)。例如,(4&8) == 0 为假,而 4 && 8 为真。现在 C# 停止了这一点(因为您将 int 转换为 bool 而不显式转换它)但其他语言(例如 javascript)将以不同的方式运行。例如,在我的 JS 控制台中: if(4&8)console.log('this should exec right?');else if(4&&8)console.log("Wrong!"); VM321:1 Wrong! @BennyMackney 这是一个 C# 问题。 OP 询问如何在 if 语句中调用这两种方法,这个答案满足了这一点。虽然这个答案是正确的,但我同意这不是最佳做法。最佳实践是分别调用这两种方法以提高可读性,然后将它们的结果组合到 if 语句中。即 bool answerA = funcA();布尔答案B = funcA()。 if (answerA && answerB) // 做某事 . 我知道。但是也提到了 Javascript,这是一个评论,而不是一个实际的答案,所以我说的是更广泛的意义。【参考方案2】:

只使用一个条;

if(txtName.Text.xyz() | txtLName.Text.xyz())



【讨论】:

以上是关于在执行相同功能时如何避免 C# 中的短路评估的主要内容,如果未能解决你的问题,请参考以下文章

(47)C#里使用短路操作符

(47)C#里使用短路操作符

你能防止 Lua 中的短路评估吗?

C# 是不是使用 await 对 if 语句执行短路评估?

是否存在程序员可能希望避免对布尔表达式进行短路评估的合理场景? [关闭]

线性搜索和短路评估(运行时错误)