急切操作和短路操作之间的区别?(| versu ||和&versu &&)

Wil*_*Wil 2 .net c#

我(还)学习C# - ,我想我明白之间的差别&&&以及|&||...

但是,在阅读了另一本指南之后,很明显我没有得到它.

我写了一个小小的真值表,正如我想的那样,它们会返回相同的.从我所看到的,使用双符号听起来像一个优秀的解决方案,但我有点困惑的差异,并想知道是否有人可以请解释/举例为什么/何时你会使用一个而不是另一个 - 我试过阅读MSDN示例,但它让我比起初时更加困惑!

在此输入图像描述

(而且,如果有人能想出更好的头衔,请随意改变它......写一个很尴尬!)

Sör*_*ren 7

&可以以两种不同的方式使用:按位"和"和逻辑"和"

逻辑&和&&之间的区别仅在于您使用&时,即使第一个表达式已经为假,也会对第二个表达式进行求值.如果你想在循环中初始化两个变量,这可能(例如)很有趣:

if ((first = (i == 7)) & (second = (j == 10))) { //do something }
Run Code Online (Sandbox Code Playgroud)

如果您使用此语法,则第一个和第二个将始终具有值(如果您使用)

if ((first = (i == 7)) && (second = (j == 10))) { //do something }
Run Code Online (Sandbox Code Playgroud)

可能是在评估之后只有第一个具有值.

对于|是一样的 和||:如果使用|,如果使用||,则总是计算两个表达式 可能只有第一个表达式被计算,如果第一个表达式为真,则会出现这种情况.

相比之下,在其他应用中,&&可能是更好的选择.如果myNumber是类型int?,你可以有类似的东西

if (myNumber != null && myNumber.Value == 7)
Run Code Online (Sandbox Code Playgroud)

这只会myNumber != null首先评估,如果空检查没问题,它只会评估第二个表达式.

if (myNumber != null & myNumber.Value == 7)
Run Code Online (Sandbox Code Playgroud)

如果myNumber为null,则在评估第二个表达式期间将以NullPointerException结束.因此,您可以在此上下文中使用&&.

  • +1是一个很好的答案 - 但是我对此的评论是 - 如果你编写其他人可能需要维护的代码 - 不要依赖它作为确保副作用发生的工具.尽可能明确地编写代码.它将使以后调试代码的任何人的生活更轻松. (2认同)

Fre*_*dou 5

你应该阅读这个短路评估.

  • @Oded,它与问题有关 (2认同)