Da esquerda para a avaliação da expressão direita
Pergunta
Em C # é garantido que expressões são avaliadas esquerda para a direita?
Por exemplo:
myClass = GetClass();
if (myClass == null || myClass.Property > 0)
continue;
Existem línguas que não cumprem?
Solução
Você realmente se referir a um recurso de linguagem chamado de "curto-circuito expressões lógicas":
O que isto significa é esta: quando o resultado de uma expressão lógica não pode mudar mais, por exemplo, quando é evidente que a expressão será avaliada como "verdadeiro" ou "falso" não importa o que, restantes partes a expressão não será avaliada.
Por exemplo, C #, Java ou JavaScript fazer isso, e você pode contar com ele nessas línguas (para responder a sua pergunta).
No seu caso, se MyClass não é nulo:
- avalia
MyClass == null
para false - uma vez que é um "ou" expressão, a segunda parte ainda pode alterar o resultado, por isso é avaliada
-
myClass.Property > 0
determina o resultado final
Se MyClass é nulo:
- avalia
MyClass == null
para true - uma vez que é um "ou" expressão, não importa o que se segue
- não mais avaliação é feita, o resultado final é true
Existem línguas que fazem expressões lógicas não curto-circuito. VB clássico é um exemplo, aqui "myClass.Property> 0" seria avaliada e produzir um erro se MyClass foi nula (chamado de "Nada" em VB).
Outras dicas
O curto-circuito é descrito na secção 7.11 de a C # 3.0 especificação:
A x funcionamento || y corresponde a a operação x | y, excepto que y é avaliado somente se x não é verdade.
Então, sim, você está bem.
Como para outras línguas - Eu nunca gosto de falar para todas idiomas. Em VB.NET, você pode usar OrElse e AndAlso que estão em curto-circuito, mas simples ou e E não são.
Mas cuidado:
Se você tem algo parecido
sprintf (buf, "% s% s", func1 (e var), func2 (e var));
com efeitos colaterais sobre var, não é definido (em C, eu não tenho certeza se a ordem de avaliação é definida em outros idiomas), em que ordem func1 () e func2 () são executados (que depende, em que ordem (esquerda ou direita) os argumentos são colocados na pilha e avaliada a partir de lá.
A ordem de avaliação depende do operador, neste caso o booleano ou (||
) é definida para ser o que é comumente chamado de curto-circuito , para fazer construções como este trabalho.
O e / ou operadores em linguagens como Ada, Visual Basic, e Pascal não curto-circuito. Eles fornecem aos operadores extras para permitir essa funcionalidade, como "e depois" e "ou então" em Ada.
Eu não tenho certeza, você está realmente interessado em ordem ou em curto-circuito avaliação?
Eu não estou 100% de certeza, mas, tanto quanto eu sei a ordem de avaliação será sempre o mesmo em C # (e presumo que a maioria, se não todos linguagens .NET). avaliação de curto-circuito funciona como explicado nas respostas anteriores.
No entanto, em C # você pode optar por não curto-circuito usando operadores simples (e, em vez de &&). Normalmente você quer curto-circuito, mas pode ser um caso em que você quer executar todas as avaliações.
Python tem or
e and
operadores de curto-circuito.
Em Java e Haskell && e || curto-circuito também.
aparte interessante:. Em Haskell isso vem naturalmente com a linguagem (você pode definir seus próprios operadores que fazem isso), enquanto em Java e C # é específica para esses dois operadores
Na verdade curto-circuito faz parte, mas você também precisa saber se as garantias de idiomas da esquerda para a direita avaliação desses. Por exemplo C (ANSI, ISO, C99) não garantem a avaliação da esquerda para a direita. No código de exemplo, seria possível verificar o valor da propriedade antes de verificar para NULL ou fazer as duas coisas ao mesmo tempo ... a maioria dos compiladores não fazer, mas não há nada impedindo-o de fazer isso e ser totalmente compatível com a especificação. Ele ainda diz-lhe para não escrever tal código por causa disso.