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.
Operador Or - Uma expressão contendo este operador será avaliada como True se apenas uma das condições for verdadeira.
|
||||||||||||||||||||||||
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.
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:
|
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
Nota: Para contornar esta limitação
podemos fazer assim: |
|
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: |
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...