VB.NET - Os novos operadores Lógicos AndAlso e OrElse.


O VB.NET apresenta dois novos operadores lógicos que tem como objetivo lhe ajudar na arte de programar. Com eles programar fica um pouco , vamos dizer , mais lógico.

Estou falando dos novos operadores : AndAlso e OrElse.

O operador AndAlso veio substituir o operador And.

O operador OrElse veio substituir o operador Or.

Nota: Os operadores And e Or (Xor) ainda existem no VB.NET e podem ser usados da mesma forma que sempre foram usados. Você lembra como eles funcionam ???

Vou explicar de forma bem rápida como funcionam para quem esta chegando agora:

Operador And

- Uma expressão contendo este operador somente será avaliada como True se ambas as condições forem verdadeiras.

Sendo a expressão 1:  AND a expressão2:  O resultado será:
True True True
True False False
False (Nem será avaliada) False

Operador Or

- Uma expressão contendo este operador será avaliada como True se apenas uma das condições for verdadeira.

Sendo a expressão 1:  AND a expressão2:  O resultado será:
True (Nem será avaliada) True
False True True
False False False
 

Operador Xor

- Uma avaliação o operador Xor somente será True quando apenas uma das expressões for igual a True. Se ambas expressões forem True a avaliação final será False.

Sendo a expressão 1:  AND a expressão2:  O resultado será:
True True False
True False True
False True True
False False False

Obs: O operador Not é usado para inverter o resultado de uma expressão lógica.Ex:  Resultado = Not Expressão

Os operadores AndAlso e OrElse possuem algumas propriedades que oferecem algumas vantagens de duas maneiras gerais:

Estes novos operadores criam um 'curto circuito'(short circuit) em uma expressão desde que o resultado esteja garantido.

Nota: Os operadores lógicos do Visual Basic .NET são:
Operador Modo Resultado
Not Uniário True se o operador é False e False se operador é True
And Binário True se ambos os operadores são True e False se qualquer um operador é False
Or Binário True se qualquer operador é True False se ambos operadores são False
Xor Binário True se exatamente um operador é True False se ambos operadores são True ou False
AndAlso Binário O mesmo que And mas utiliza curto-circuito
OrElse Binário O mesmo que Or mas utiliza curto-circuito

O 'curto circuito' é uma recurso poderoso, especialmente quando tratamos com tipos de referência ou avaliação de expressões. Vejamos um exemplo

If (Not x Is Nothing) and (x.y = 4) then
...
End If

Nota: Para contornar esta limitação podemos fazer assim:

If (Not x Is Nothing) then
     if x.y = 4 then
           ....
     End If
End If


Neste código estou primeiro verificando se x Não for Nothing E se x multiplicado por y resulta em 4.

 

Sem utilizar o curto circuito (que é o que ocorre quando usamos AND) este código irá disparar uma exceção se x for igual a nothing , pois ambos os lados da operação serão avaliados e nothing multiplicado por algo causará um erro.

Outro exemplo bastante simples é o seguinte :

If a < Valor1 And b < (Valor2 / Valor3) Then
   ...
End If
Vamos supor que os valores para as variáveis sejam:

Valor1 = 1 ,  Valor2 = 1,  Valor3 = 0,  a = 1 e b = 1

Neste caso teremos que avaliar a expressão:
 
1 < 1  AND 1 < (1/0)
 

Como não existe o curto circuito usando AND a expressão será totalmente avaliada e ocorrerá um erro em tempo de execução pois não existe divisão por zero.

Vamos agora repetir o código acima no VB.NET usando o operador AndAlso no lugar de And:

Dim Valor1 As Integer
Dim Valor2 As Integer
Dim Valor3 As Integer
Dim a As Integer
Dim b As Integer

Valor1 = 1
Valor2 = 1
Valor3 = 0
a = 1
b = 1

If a > Valor1 AndAlso b > (Valor2 / Valor3) Then
     ..........
End If
Ao substituir o AND pelo AndAlso existente no VB.NET quando a expressão for avaliada  o VB.NET já sabe que a expressão não pode ser  resolvida com sucesso  desde que a primeira parte da condição :   a não ser maior que valor1 é falsa.

Desta forma o VB.NET para de efetuar a avaliação da expressão e não irá gerar o erro.

Podemos então observar que ao colocarmos a expressão que for mais provável que seja False no lado esquerdo quando usamos AndAlso isto irá prevenir que o lado direito da expressão seja avaliado.

Apenas para lembrar, a precedência dos operadores no Visual Basic.NET é a seguinte:

Categoria Operador Símbolo Usando a tabela ao lado para analisar o exemplo abaixo temos:

10  >  8  And 20  < 40 And 11 <>11

 True      And      True    And   False

que resultará em : False

 

Aritmético Exponenciação ^
Aritmético Negação -
Aritmético Multiplicação e
divisão ponto-flutuante
*, /
Aritmético Divisão inteira \
Aritmético Modulo
 
Mod
Aritmético Adição e subtração +, -
Concatenação Concatenação &
Lógico Relacional =, <>, <, >, <=, >=, Like, Is, TypeOf...Is
Lógico Condicional NOT Not
Lógico Condicional AND And, AndAlso
Lógico Condicional OR Or, OrElse
Lógico Condicional XOR Xor

O operador OrElse tem comportamento similar ao AndAlso e também implementa o curto circuito para a segunda operação se a primeira for igual a True.  Se a primeira expressão avaliada for True a expressão inteira será True não importando o resultado da segunda expressão.

Afinal, um pouco de lógica não faz mal a ninguém...