Qual é a diferença entre And e AndAlso no VB.NET?


Respostas:


380

O Andoperador avalia os dois lados, onde AndAlsoavalia o lado direito se e somente se o lado esquerdo for verdadeiro.

Um exemplo:

If mystring IsNot Nothing And mystring.Contains("Foo") Then
  ' bla bla
End If

O exemplo acima gera uma exceção se mystring = Nothing

If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
  ' bla bla
End If

Este não lança uma exceção.

Portanto, se você é do mundo C #, deve usar AndAlsoo que usaria &&.

Mais informações aqui: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/


2
O link "Mais informações" está quebrado. Aqui está a nova URL: panopticoncentral.net/2003/08/18/…
Rory O'Kane

12
Alguém sabe por que não escolheu "AndThen"? Eu acho que isso seria mais intuitivo.
23414 Tmighty

7
Eu sempre pensei que isso era contra-intuitivo. E também implica que ele irá verificar os dois e isso deve ser o contrário! Daí porque eu tenho que ir ao SO para checar coisas assim (sim, eu sou um cara do #) Você também nunca deve fazer uma pergunta como "diferença entre And e AndAlso". Muitos ands! Meu professor de Inglês teria me matado
Robin French

3
Sempre que uso o OrElse, sempre penso em South Park "Ou então?" "Exatamente"
Robin French

1
@tmighty supondo que isso causaria mais confusão porque Thené sua própria palavra-chave.
binki

29

O Andoperador verificará todas as condições na declaração antes de continuar, enquanto o operador Andalso irá parar se souber que a condição é falsa. Por exemplo:

if x = 5 And y = 7

Verifica se x é igual a 5 e se y é igual a 7, continua se ambos forem verdadeiros.

if x = 5 AndAlso y = 7

Verifica se x é igual a 5. Caso contrário, não verifica se y é 7, porque sabe que a condição já é falsa. (Isso é chamado de curto-circuito.)

Geralmente, as pessoas usam o método de curto-circuito se houver um motivo para não verificar explicitamente a segunda parte, se a primeira parte não for verdadeira, como se fosse lançada uma exceção se marcada. Por exemplo:

If Not Object Is Nothing AndAlso Object.Load()

Se usado em Andvez de AndAlso, ainda tentaria, Object.Load()mesmo que fosse nothing, o que geraria uma exceção.


14
Se o lado direito tiver um efeito colateral necessário, basta movê-lo para o lado esquerdo em vez de usar "E". Você realmente só precisa de "E" se os dois lados tiverem efeitos colaterais. E se você tem tantos efeitos colaterais, provavelmente está fazendo outra coisa errada.
Joel Coehoorn

1
Primeiro, o Andalso não é usado principalmente para 'economizar no tempo de execução', isso é absurdo. Segundo, fazer com que o segundo argumento realize algum "efeito colateral" útil é uma prática ruim.
11339 Tor Haugen

2
Você não pode argumentar que ele não 'salva no tempo de execução'. E eu encontrei situações em que os efeitos colaterais são de fato, não uma prática ruim.
11789 Ed Marty

1
"Geralmente, as pessoas usam o método de curto-circuito se houver uma razão para explicitamente não verificar a segunda parte" Erm, wut? Eu espero que as pessoas usem curto-circuito, a menos que tenham uma razão para não fazer isso! Ninguém deve usar o velho and/ a ormenos que tenha um motivo - do qual eu acho que os legítimos são poucos e distantes entre si. Certamente, há um motivo para a maioria das outras linguagens entrar em curto-circuito por padrão: ela retém o sentido do resultado sem avaliar expressões potencialmente caras quando elas não contribuem com nada. Os efeitos colaterais ocultos em condições devem ser bem observados. Mas essa é apenas a minha opinião ...
underscore_d

20

Curiosamente, nenhuma das respostas mencionou que Ande Orno VB.NET são operadores de bits OrElsee AndAlsosão estritamente operadores booleanos.

Dim a = 3 OR 5 ' Will set a to the value 7, 011 or 101 = 111
Dim a = 3 And 5 ' Will set a to the value 1, 011 and 101 = 001
Dim b = 3 OrElse 5 ' Will set b to the value true and not evaluate the 5
Dim b = 3 AndAlso 5 ' Will set b to the value true after evaluating the 5
Dim c = 0 AndAlso 5 ' Will set c to the value false and not evaluate the 5

Nota : um número inteiro diferente de zero é considerado true; Dim e = not 0definido ecomo -1demonstrativo Nottambém é um pouco operador.

||e &&(as versões C # de OrElsee AndAlso) retornam a última expressão avaliada que seria 3e 5respectivamente. Isso permite que você use o idioma v || 5em C # para fornecer 5como o valor da expressão quando vé nullou ( 0e um número inteiro) e o valor de voutra forma. A diferença na semântica pode pegar um programador de C # brincando no VB.NET desprevenido, pois esse "idioma padrão do valor" não funciona no VB.NET.

Portanto, para responder à pergunta : Use Ore Andpara operações de bit (inteiro ou booleano). Use OrElsee AndAlsopara "curto-circuito" uma operação para economizar tempo ou testar a validade de uma avaliação antes de avaliá-la. If valid(evaluation) andalso evaluation thenouif not (unsafe(evaluation) orelse (not evaluation)) then

Bônus: Qual é o valor do seguinte?

Dim e = Not 0 And 3

Eu acho que você confundiu ||e &&com ??. Enquanto existem línguas onde ||irá devolver o valor não Falsey, C # não é um deles, e retorna um bool(exceto para os operadores anuláveis levantadas, onde você obtém um Nullable<bool>resultado)
Ben Voigt

14
If Bool1 And Bool2 Then

Avalia Bool1 e Bool2

If Bool1 AndAlso Bool2 Then

Avalia Bool2 se e somente se Bool1 for verdadeiro.


13

Apenas para todas as pessoas que dizem que os efeitos colaterais são ruins: um lugar onde ter dois efeitos colaterais em uma condição é bom seria ler dois objetos de arquivo em conjunto.

While File1.Seek_Next_Row() And File2.Seek_Next_Row()
    Str1 = File1.GetRow()
    Str2 = File2.GetRow()
End While

O uso de Andgarante que uma linha seja consumida toda vez que a condição for verificada. Considerando que AndAlsopode ler a última linha de File1e sair File2sem uma linha consumida.

É claro que o código acima não funcionaria, mas eu uso efeitos colaterais como esse o tempo todo e não considero o código " ruim " ou " mau ", como alguns levam a acreditar. É fácil de ler e eficiente.


5

Uma maneira simples de pensar sobre isso é usar um inglês ainda mais claro

If Bool1 And Bool2 Then
If [both are true] Then


If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then

3
O inglês é mais confuso que o código, porque não possui uma especificação!
binki

5

AndAlso é muito parecido com And, exceto que funciona como && em C #, C ++, etc.

A diferença é que, se a primeira cláusula (a anterior a AndAlso) for verdadeira, a segunda cláusula nunca será avaliada - a expressão lógica composta será "curto-circuito".

Às vezes, isso é muito útil, por exemplo, em uma expressão como:

If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
   ...
End If

O uso da antiga E na expressão acima geraria uma NullReferenceException se myObj fosse nulo.


5

Consulte também a pergunta Stack Overflow: Devo sempre usar os operadores AndAlso e OrElse? .

Além disso: um comentário para aqueles que mencionaram o uso Andse o lado direito da expressão tiver um efeito colateral que você precisa:

Se o lado direito tiver um efeito colateral necessário, basta movê-lo para o lado esquerdo em vez de usar "E". Você realmente só precisa de "E" se os dois lados tiverem efeitos colaterais. E se você tem tantos efeitos colaterais, provavelmente está fazendo outra coisa errada. Em geral, você realmente deve preferir o AndAlso.


3

Além das respostas acima, o AndAlso também fornece um processo de condicionamento conhecido como curto-circuito. Muitas linguagens de programação possuem essa funcionalidade incorporada, como o vb.net, e podem fornecer aumentos substanciais de desempenho em longas instruções de condição, cortando avaliações desnecessárias.

Outra condição semelhante é a condição OrElse, que só verificaria a condição correta se a condição esquerda for falsa, cortando verificações de condição desnecessárias após a descoberta de uma condição verdadeira.

Aconselho você a sempre usar processos de curto-circuito e estruturar suas declarações condicionais de maneiras que possam se beneficiar mais com isso. Por exemplo, teste suas condições mais eficientes e mais rápidas primeiro, para que você só execute longas condições quando for absolutamente necessário e faça um curto-circuito nas outras vezes.


Também vale a pena mencionar o IIF (Immediate If), porque ele não provoca um curto-circuito e pode criar condições bastante diferentes da intenção do programador, uma vez que os componentes verdadeiro e falso são avaliados. Antes, alguém afirmou que usa esse comportamento de efeito colateral intencionalmente, mas - não o vejo como um método eficaz, pois o Immediate If não tem intenção de realizar a avaliação da maneira que posso detectar.
Jinzai #

"Além das respostas acima, o AndAlso também fornece um processo de condicionamento conhecido como curto-circuito." Toda resposta acima desta se concentra em curto-circuito. : P Mas boa descrição e recomendações.
underscore_d

1

Para a maioria de nós, OrElse e AndAlso farão o truque, exceto por algumas exceções confusas (menos de 1% onde podemos ter que usar Or e And).

Tente não se deixar levar pelas pessoas que exibem suas lógicas booleanas e fazem com que pareça uma ciência de foguetes.

É bastante simples e direto e, ocasionalmente, seu sistema pode não funcionar conforme o esperado, porque em primeiro lugar não gosta da sua lógica. E, no entanto, seu cérebro continua lhe dizendo que a lógica dele é 100% testada e comprovada e deve funcionar. Nesse exato momento, pare de confiar em seu cérebro e peça que ele pense novamente ou (não OrElse ou talvez OrElse) você se força a procurar outro emprego que não exija muita lógica.


0

Para entender com palavras, não com bacalhau:

Caso de uso:
Com "And", o compilador verificará todas as condições, portanto, se você estiver verificando se um objeto pode ser "Nothing" e, em seguida, verificando uma de suas propriedades, ocorrerá um erro no tempo de execução.
Mas com o AndAlso com o primeiro “false” nas condições, ele verificará o próximo para que você não tenha nenhum erro.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.