在C#中,是否保证表达式从左到右进行求值?
例如:
myClass = GetClass(); if (myClass == null || myClass.Property > 0) continue;
有没有不符合的语言?
您实际上是指一种称为"短路逻辑表达式"的语言功能:
这意味着:当逻辑表达式的结果不再发生变化时,例如,当表达式无论如何都将评估为"真"或"假"时,表达式的剩余部分将不会被评估.
例如,C#,Java或JavaScript就是这样做的,你可以用这些语言来依赖它(回答你的问题).
在您的情况下,如果MyClass不为null:
MyClass == null
评估为假
因为它是一个"或"表达式,第二部分仍然可以改变结果,所以它被评估
myClass.Property > 0
确定最终结果
如果MyClass为null:
MyClass == null
评估为真
因为它是一个"或"表达式,所以后面的内容并不重要
不再进行评估,最终结果是真的
有些语言不会使逻辑表达式短路.经典VB就是一个例子,如果MyClass为null(在VB中称为"Nothing"),将评估"myClass.Property> 0",并产生错误.
C#3.0规范的第7.11节描述了短路:
操作x || y对应于操作x | y,除了仅在x不为真时才计算y.
是的,你很好.
至于其他语言 - 我从不喜欢说所有语言.在VB.NET中,你可以使用OrElse和AndAlso,它们是短路的,但是普通的Or和And不是.