No VB.NET, qual é a diferença entre And
e AndAlso
? Qual devo usar?
No VB.NET, qual é a diferença entre And
e AndAlso
? Qual devo usar?
Respostas:
O And
operador avalia os dois lados, onde AndAlso
avalia o lado direito se e somente se o lado esquerdo for verdadeiro.
Um exemplo:
If mystring IsNot Nothing And mystring.Contains("Foo") Then
' bla bla
End If
O exemplo acima gera uma exceção se mystring = Nothing
If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
' bla bla
End If
Este não lança uma exceção.
Portanto, se você é do mundo C #, deve usar AndAlso
o que usaria &&
.
Mais informações aqui: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/
Then
é sua própria palavra-chave.
O And
operador verificará todas as condições na declaração antes de continuar, enquanto o operador Andalso irá parar se souber que a condição é falsa. Por exemplo:
if x = 5 And y = 7
Verifica se x é igual a 5 e se y é igual a 7, continua se ambos forem verdadeiros.
if x = 5 AndAlso y = 7
Verifica se x é igual a 5. Caso contrário, não verifica se y é 7, porque sabe que a condição já é falsa. (Isso é chamado de curto-circuito.)
Geralmente, as pessoas usam o método de curto-circuito se houver um motivo para não verificar explicitamente a segunda parte, se a primeira parte não for verdadeira, como se fosse lançada uma exceção se marcada. Por exemplo:
If Not Object Is Nothing AndAlso Object.Load()
Se usado em And
vez de AndAlso
, ainda tentaria, Object.Load()
mesmo que fosse nothing
, o que geraria uma exceção.
and
/ a or
menos que tenha um motivo - do qual eu acho que os legítimos são poucos e distantes entre si. Certamente, há um motivo para a maioria das outras linguagens entrar em curto-circuito por padrão: ela retém o sentido do resultado sem avaliar expressões potencialmente caras quando elas não contribuem com nada. Os efeitos colaterais ocultos em condições devem ser bem observados. Mas essa é apenas a minha opinião ...
Curiosamente, nenhuma das respostas mencionou que And
e Or
no VB.NET são operadores de bits OrElse
e AndAlso
são estritamente operadores booleanos.
Dim a = 3 OR 5 ' Will set a to the value 7, 011 or 101 = 111
Dim a = 3 And 5 ' Will set a to the value 1, 011 and 101 = 001
Dim b = 3 OrElse 5 ' Will set b to the value true and not evaluate the 5
Dim b = 3 AndAlso 5 ' Will set b to the value true after evaluating the 5
Dim c = 0 AndAlso 5 ' Will set c to the value false and not evaluate the 5
Nota : um número inteiro diferente de zero é considerado true
; Dim e = not 0
definido e
como -1
demonstrativo Not
também é um pouco operador.
||
e &&
(as versões C # de OrElse
e AndAlso
) retornam a última expressão avaliada que seria 3
e 5
respectivamente. Isso permite que você use o idioma v || 5
em C # para fornecer 5
como o valor da expressão quando v
é null
ou ( 0
e um número inteiro) e o valor de v
outra forma. A diferença na semântica pode pegar um programador de C # brincando no VB.NET desprevenido, pois esse "idioma padrão do valor" não funciona no VB.NET.
Portanto, para responder à pergunta : Use Or
e And
para operações de bit (inteiro ou booleano). Use OrElse
e AndAlso
para "curto-circuito" uma operação para economizar tempo ou testar a validade de uma avaliação antes de avaliá-la. If valid(evaluation) andalso evaluation then
ouif not (unsafe(evaluation) orelse (not evaluation)) then
Bônus: Qual é o valor do seguinte?
Dim e = Not 0 And 3
||
e &&
com ??
. Enquanto existem línguas onde ||
irá devolver o valor não Falsey, C # não é um deles, e retorna um bool
(exceto para os operadores anuláveis levantadas, onde você obtém um Nullable<bool>
resultado)
If Bool1 And Bool2 Then
Avalia Bool1 e Bool2
If Bool1 AndAlso Bool2 Then
Avalia Bool2 se e somente se Bool1 for verdadeiro.
Apenas para todas as pessoas que dizem que os efeitos colaterais são ruins: um lugar onde ter dois efeitos colaterais em uma condição é bom seria ler dois objetos de arquivo em conjunto.
While File1.Seek_Next_Row() And File2.Seek_Next_Row()
Str1 = File1.GetRow()
Str2 = File2.GetRow()
End While
O uso de And
garante que uma linha seja consumida toda vez que a condição for verificada. Considerando que AndAlso
pode ler a última linha de File1
e sair File2
sem uma linha consumida.
É claro que o código acima não funcionaria, mas eu uso efeitos colaterais como esse o tempo todo e não considero o código " ruim " ou " mau ", como alguns levam a acreditar. É fácil de ler e eficiente.
AndAlso é muito parecido com And, exceto que funciona como && em C #, C ++, etc.
A diferença é que, se a primeira cláusula (a anterior a AndAlso) for verdadeira, a segunda cláusula nunca será avaliada - a expressão lógica composta será "curto-circuito".
Às vezes, isso é muito útil, por exemplo, em uma expressão como:
If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
...
End If
O uso da antiga E na expressão acima geraria uma NullReferenceException se myObj fosse nulo.
Consulte também a pergunta Stack Overflow: Devo sempre usar os operadores AndAlso e OrElse? .
Além disso: um comentário para aqueles que mencionaram o uso And
se o lado direito da expressão tiver um efeito colateral que você precisa:
Se o lado direito tiver um efeito colateral necessário, basta movê-lo para o lado esquerdo em vez de usar "E". Você realmente só precisa de "E" se os dois lados tiverem efeitos colaterais. E se você tem tantos efeitos colaterais, provavelmente está fazendo outra coisa errada. Em geral, você realmente deve preferir o AndAlso.
Além das respostas acima, o AndAlso também fornece um processo de condicionamento conhecido como curto-circuito. Muitas linguagens de programação possuem essa funcionalidade incorporada, como o vb.net, e podem fornecer aumentos substanciais de desempenho em longas instruções de condição, cortando avaliações desnecessárias.
Outra condição semelhante é a condição OrElse, que só verificaria a condição correta se a condição esquerda for falsa, cortando verificações de condição desnecessárias após a descoberta de uma condição verdadeira.
Aconselho você a sempre usar processos de curto-circuito e estruturar suas declarações condicionais de maneiras que possam se beneficiar mais com isso. Por exemplo, teste suas condições mais eficientes e mais rápidas primeiro, para que você só execute longas condições quando for absolutamente necessário e faça um curto-circuito nas outras vezes.
Para a maioria de nós, OrElse e AndAlso farão o truque, exceto por algumas exceções confusas (menos de 1% onde podemos ter que usar Or e And).
Tente não se deixar levar pelas pessoas que exibem suas lógicas booleanas e fazem com que pareça uma ciência de foguetes.
É bastante simples e direto e, ocasionalmente, seu sistema pode não funcionar conforme o esperado, porque em primeiro lugar não gosta da sua lógica. E, no entanto, seu cérebro continua lhe dizendo que a lógica dele é 100% testada e comprovada e deve funcionar. Nesse exato momento, pare de confiar em seu cérebro e peça que ele pense novamente ou (não OrElse ou talvez OrElse) você se força a procurar outro emprego que não exija muita lógica.
Caso de uso:
Com "And", o compilador verificará todas as condições, portanto, se você estiver verificando se um objeto pode ser "Nothing" e, em seguida, verificando uma de suas propriedades, ocorrerá um erro no tempo de execução.
Mas com o AndAlso com o primeiro “false” nas condições, ele verificará o próximo para que você não tenha nenhum erro.