;

terça-feira, 7 de dezembro de 2010

AndAlso e OrElse do VB.NET

O post desta vez pode ser algo banal para grande parte dos programadores VB.NET. Porém resolvi escrever este post porque outro dia mostrei um código meu para um amigo, também programador .NET e de repente ele aponta o dedo para o meio do código e pergunta o que significava determinado código no meu IF. Era um “AndAlso”.

O operador lógico AndAlso, assim como o OrElse, implementa o chamado curto circuito. Como assim? Pois bem.  Pra quem está acostumado com C# pode não saber, mas no VB.NET os operadores AND e OR fazem com que toda a expressão composta com operadores lógicos seja avaliada. Ou seja,  em uma expressão composta com AND, se a  primeira expressão for  igual a FALSE, o VB irá avaliar a segunda expressão. O que quero dizer é que, no caso de um AND, se a primeira expressão for igual a false, mesmo que a segunda seja verdadeira, aquele bloco de código condicional não será executado (lembre-se: False AND True é igual a false).

Desta forma o operador AndAlso se torna mais prático e rápido, pois no caso da primeira expressão ser falsa, não irá avaliar a segunda expressão.  Isto irá otimizar seu código, ainda mais se as expressões adicionais forem uma chamada de função booleana. 

Outro ganho que se tem com este tipo de operador lógico, é que você não precisará fazer IFs aninhados no caso da segunda expressão depender da primeira. Vou usar um exemplo pra explicar:

Eu tenho uma variável do tipo string, que recebe um valor qualquer. Se eu quiser saber se o caractere na quinta posição da string é igual a determinado valor, terei que, por segurança, fazer um IF perguntando se esta string possui ao menos cinco caracteres, para depois perguntar se aquele caractere é igual ao valor que estou avaliando. Se fizer uma expressão composta, conforme abaixo, será gerada uma exceção, caso a variável “palavra” não possua cinco caracteres.


        If palavra.Length >= 5 And palavra(4) = "%" Then
            'código
        End If

Então, para não gerar um erro de execução e não precisar usar IFs aninhados, faça da seguinte maneira:

        If palavra.Length >= 5 AndAlso palavra(4) = "%" Then
            'código
        End If

Portanto, se a variável não tiver no mínimo cinco caracteres, não irá avaliar a segunda expressão. Quanto ao OrElse, ele funciona de forma similar, porém, no caso da primeira expressão ser verdadeira, não irá avaliar a segunda.

E o no C#? Bom, no C# é mais comum é utilizar os operadores "&&" (and) e "||" (or), que implementam o curto circuito. Porém, ao contrário do que eu havia dito, C# também possui operadores lógicos que analisam todas as expressões antes de executar o operador lógico. São os operadores "&" e "|", and e or, respectivamente.

Vivendo (errando) e aprendendo.

Abraços

3 comentários:

Samir disse...

Isto é legal também quando você precisa testar um atributo de um objeto...

Ex:

if objChapa.Espessura <> 0

vai dar erro se objChapa for Nothing.

Logo, pode ser melhor usar:

if objChapa isNot Nothing AndAlso objChapa.Espessura <> 0

dotDicas disse...

Isto mesmo Samir. Boa dica.
Obrigado pela contribuição.

dotDicas disse...

Correção

Eu havia dito que os operadores lógicos do C# implementam o curto circuito por padrão. Isto não é verdade. O C# possui os operadores "&" e "|", que analisam todas as expressões antes de executar o operador. Já está corrigido no artigo.

Obrigado

Postar um comentário