【发布时间】:2010-09-08 11:22:54
【问题描述】:
【问题讨论】:
-
我想如果你想做按位运算你会使用
And和Or
标签: .net vb.net boolean-logic
【问题讨论】:
And和Or
标签: .net vb.net boolean-logic
它们在 VB.net 中是完全不同的功能,并且都有各自的用例(尽管对于最常见的用途,两者都可以使用)
AndAlso 和 OrElse 是 条件 运算符,它们返回 true 或 false 布尔值,并且只评估他们需要的内容,直到它们达到无法更改的结果(对于 AndAlso 为 false, OrElse 为真)。这些相当于 C# 和 Java 等语言中的 && 和 ||。
And 和 Or 是 按位 运算符,它们将传递给它们的任何位组合成一个结果,并且由于这些位总是可以通过进一步评估来改变,因此需要评估一切。在 C# 和 Java 等语言中,它们相当于 & 和 |。
大多数时候,当您查看和/或操作时,您需要条件结果。按位运算将产生一个真值或假值,并且(通常)会匹配来自适当条件运算符的真假结果,因为它们会评估所有内容,所以它们平均需要更长的时间。
位运算符适用于您关心值中的特定位时,通常用于以尽可能紧凑的方式存储设置或权限,并尽可能快地读取和应用它们。例如,基于 Unix 的系统中文件的读/写/执行权限就是这样使用位标志的:
0b001 - 执行权限
0b010 - 写权限
0b100 - 读取权限
所以,在十进制中,值 7 可以完成所有三个操作,值 4 只能读取,6 可以读取和写入,等等。如果有人试图写入文件,它会使用 @987654329 检查他们的权限@ 并根据该位置的位获得真假结果。要更新该值以让用户执行文件,您可以在其当前权限上使用 Or 0b001 并存储结果。
区别就在这里:
0b001(真实)和 0b010(真实)= 0b000(虚假)
0b001(真实)AndAlso 0b010(真实)=真实
【讨论】:
是否存在我不想使用 AndAlso 运算符而不是 And 运算符的情况?
当然:如果你想确保表达式的两边都被计算。例如,如果双方都是作为具有副作用的其他操作的结果返回布尔值的方法调用,则可能会出现这种情况。
但一般来说,只要在 C/C++/C# 中使用 &&/||,就使用 AndAlso/OrElse,这当然是绝大多数时间。
【讨论】:
来自MSDN:
短路权衡
短路可以通过不评估不能改变逻辑运算结果的表达式来提高性能。但是,如果该表达式执行其他操作,则短路会跳过这些操作。例如,如果表达式包含对 Function 过程的调用,则如果表达式短路,则不会调用该过程,并且 Function 中包含的任何其他代码都不会运行。如果你的程序逻辑依赖于任何附加代码,你应该避免短路操作符。
【讨论】: