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 em uma 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 If’s dentro de If’s 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.
PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!
0 comentários:
Enviar um comentário