Ir para o conteúdo

AndAlso, OrElse e Using

A utilização de operadores lógicos é tão comum que um pouco por todo o código se usam operadores como o And ou o Or. No entanto, o VB.Net tem novos operadores, já disponíveis nas primeiras versões .Net, que muitos não usam por desconhecimento da sua real funcionalidade.

Os operadores AndAlso e OrElse, são designados short-circuiting operators, ou seja, são operadores de rápida validação ou de circuito reduzido.

Vejamos o funcionamento de uma validação:

CONDIÇÃO 1 CONDIÇÃO 2 RESULTADO 
True       True       True 
False      True       False 
True       False      False 
False      False      False

Ou seja, qualquer condição a False irá produzir um resultado False.

O que o AndAlso faz é quando encontrar uma condição a False, decide logo e não executa a condição seguinte. Isto pode reduzir bastante, dependendo das condições, o tempo de execução da aplicação.

A seguinte função leva algum tempo a executar e retorna o resultado (True ou False) indicado no parâmetro. Serve apenas para mostrar os diferentes resultados, na utilização de diferentes operadores, nos exemplos seguintes.

''' <summary> 
''' Efectua um ciclo retornando o resultado indicado no parâmetro 
''' </summary> 
Private Function doTestLoop(ByVal result As Boolean) As Boolean 
    For x As Byte = 0 To 200 
        Threading.Thread.Sleep(5) 
        Application.DoEvents() 
    Next 

    Debug.WriteLine("Executado às " & Now.ToString) 
    Return result 
End Function

Este exemplo executa duas vezes a função doTestLoop() e irá depois parar na condição falsa:

If doTestLoop(False) And doTestLoop(False) Then 
    Stop' Condição verdadeira 
Else 
    Stop' Condição falsa 
End If

Usando o operador AndAlso, e no mesmo exemplo, irá ser executado apenas a primeira condição e salta para a condição falsa, reduzindo o tempo de ciclo.

If doTestLoop(False) AndAlso doTestLoop(False) Then 
    Stop ' Condição verdadeira 
Else 
    Stop ' Condição falsa 
End If

Isto permite que se criem validações, apenas numa linha, sem erros indesejados.

Por exemplo, o seguinte código tenta encontrar um form na aplicação que não existe, ficando a variável frm a Nothing. Neste caso é verificada a primeira condição, que é falsa, e sai da validação, mas se utilizássemos o operador ´And`, iria ser feita a primeira condição e depois a segunda, originando um erro "Object reference not set to an instance of an object".

Dim frm As Form = My.Application.OpenForms("Nome não Existente") 
If frm IsNot Nothing AndAlso frm.Text = "Nome Pretendido" Then 
    Stop ' Condição verdadeira 
End If

O mesmo acontece com o operador OrElse. Se encontrar uma condição verdadeira ele decide, sem ter de executar a próxima.

A validação de uma condição Or funciona desta forma, ou seja, qualquer condição verdadeira irá ter um resultado verdadeiro:

CONDIÇÃO 1 CONDIÇÃO 2 RESULTADO 
True       True       True 
False      True       True 
True       False      True 
False      False      False

Neste exemplo simples será executado apenas a primeira condição, saltando logo para a condição verdadeira:

If doTestLoop(True) OrElse doTestLoop(True) Then 
    Stop ' Condição verdadeira 
End If

Resumindo: são dois operadores que podem e devem ser utilizados, especialmente se as condições/validações podem levar algum tempo a executar. Podem ainda simplificar o código, evitando-se utilizar Ifs dentro de Ifs para se conseguir o mesmo resultado.


O bloco Using é uma novidade da Visual Studio 2005/.Net Framework 2.0 e permite criar um bloco, onde no final, os recursos utilizados são libertados. Isto é muito útil e prático, especialmente quando se utilizam unmanaged resources, como ligações a base de dados, ligações a ficheiros de texto, objectos COM, etc.

Os unmanaged resources, são recursos que o CLR (Common Language Runtime) não liberta e que ficam a consumir desnecessariamente recursos do sistema. Os managed resources, por sua vez, são geridos pelo CLR através do .Net Framework Garbage Collector (GC).

No seguinte exemplo, mesmo que aconteça um erro, a ligação à base de dados é fechada e limpa, porque o Using faz o .Disposal() automaticamente sem código adicional.

Dim myConnectionString As String = String.Empty 

Using conn As New SqlConnection(myConnectionString) 
    conn.Open() 

    Using command As New SqlCommand("SELEC * FROM myTable", conn) 
        command.ExecuteNonQuery() 
    End Using 

End Using

Como se pode ver neste exemplo simples, é declarada a variável, usada dentro do bloco e finalmente faz o Disposal da variável.