Pergunta

Em VB.NET, qual é a diferença entre And e AndAlso? Qual devo usar?

Foi útil?

Solução

O operador And avalia ambos os lados, onde AndAlso avalia o lado direito se e somente se o lado esquerdo é verdade.

Um exemplo:

If mystring IsNot Nothing And mystring.Contains("Foo") Then
  ' bla bla
End If

O acima lança uma exceção se mystring = Nothing

If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
  ' bla bla
End If

Este não lançar uma exceção.

Portanto, se você vem do mundo do C #, você deve usar AndAlso como você usaria &&.

Mais informações aqui: http: / /www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/

Outras dicas

O operador And irá verificar todas as condições na instrução antes de continuar, enquanto o operador AndAlso vai parar se ele sabe a condição é falsa. Por exemplo:

if x = 5 And y = 7

Verifica se x é igual a 5, e, se y for igual a 7, em seguida, continua, se ambos forem verdadeiras.

if x = 5 AndAlso y = 7

Verifica se x é igual a 5. Se não for, ele não verifica se y é 7, porque sabe que a condição é falsa já. (Isso é chamado de curto-circuito.)

Geralmente as pessoas usam o método-circuito curto, se há uma razão para não verificar explicitamente a segunda parte, se a primeira parte não é verdade, como se ele iria lançar uma exceção se verificado. Por exemplo:

If Not Object Is Nothing AndAlso Object.Load()

Se isso And usado em vez de AndAlso, ele ainda tentaria Object.Load() mesmo que fosse nothing, que iria lançar uma exceção.

Curiosamente nenhuma das respostas mencionou que And e Or em VB.NET são operadores bit enquanto OrElse e AndAlso são operadores estritamente booleanas.

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 inteiro diferente de zero é considerado true; Dim e = not 0 irá definir e para -1 demonstrando Not é também um operador bit.

|| e && (as versões C # de OrElse e AndAlso) retornar a última expressão avaliada que seria 3 e 5 respectivamente. Isso permite que você use o v || 5 idioma em C # para dar 5 como o valor da expressão quando v é null ou (0 e um inteiro) e o valor de v contrário. A diferença de semântica pode pegar um programador C # dabbling em VB.NET desprevenido como este "idioma valor padrão" não funciona em VB.NET.

Assim, para responder a pergunta : Use Or e And para operações de bit (inteiro ou Boolean). Use OrElse e AndAlso para "curto-circuito" uma operação para economizar tempo, ou testar a validade de uma avaliação antes de avaliá-lo. If valid(evaluation) andalso evaluation then ou if not (unsafe(evaluation) orelse (not evaluation)) then

Bonus:? O que é o valor da seguinte

Dim e = Not 0 And 3
If Bool1 And Bool2 Then

avalia tanto Bool1 e bool2

If Bool1 AndAlso Bool2 Then

Avalia bool2 se e somente se Bool1 é verdade.

Apenas para todas aquelas pessoas que dizem que os efeitos colaterais são mal:. Um lugar onde ter dois efeitos colaterais de uma condição é boa estaria lendo dois objetos de arquivo em paralelo

While File1.Seek_Next_Row() And File2.Seek_Next_Row()
    Str1 = File1.GetRow()
    Str2 = File2.GetRow()
End While

Usando o And garante que uma linha é consumido cada vez que a condição é verificada. Considerando AndAlso pode ler a última linha de File1 e File2 licença sem uma linha consumido.

Claro que o código acima não iria funcionar, mas eu usar efeitos colaterais como esta o tempo todo e não se trata de " mau " ou " mal " código como alguns querem levar você a acreditar. É fácil de ler e eficiente.

Uma maneira simples de pensar sobre isso é usando até mesmo mais simples Inglês

If Bool1 And Bool2 Then
If [both are true] Then


If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then

AndAlso é muito parecido E, exceto que funciona como && em C #, C ++, etc.

A diferença é que, se a primeira cláusula (a anterior AndAlso) é verdadeira, a segunda cláusula nunca é avaliada -. A expressão lógica composto é "curto-circuito"

Isso às vezes é muito útil, por exemplo, em uma expressão como:

If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
   ...
End If

Usando o velho E na expressão acima jogaria um NullReferenceException se myObj foram nulos.

Veja também pergunta Stack Overflow: Devo sempre usar os operadores AndAlso e OrElse

Além disso: Um recado para aqueles que mencionei usando And se o lado direito da expressão tem um efeito colateral que você precisa:

Se o lado direito tem um efeito colateral que você precisa, basta movê-lo para o lado esquerdo em vez de usar "E". Você só precisa realmente "E" se ambos lados têm efeitos colaterais. E se você tiver que muitos efeitos colaterais acontecendo provavelmente você está fazendo alguma coisa errada. Em geral, você realmente deve preferir AndAlso.

Além das respostas acima, AndAlso fornece um processo de condicionamento conhecido como curto-circuitos. Muitas linguagens de programação têm essa funcionalidade incorporada como vb.net faz, e pode proporcionar aumentos substanciais de desempenho em instruções de condição longos cortando as avaliações que são desnecessários.

Outra condição semelhante é a condição OrElse que só iria verificar a condição de direito se a condição esquerda é falso, reduzindo assim as verificações de condição desnecessários após uma condição verdadeira é encontrada.

Eu aconselho que você use sempre os processos de curto-circuito e estruturar suas declarações condicionais de maneiras que podem se beneficiar mais com isso. Por exemplo, testar suas condições mais eficientes e mais rápidas primeiro, para que você só executar seus longos condições quando você absolutamente tem que e curto-circuito das outras vezes.

Para a maioria de nós OrElse e AndAlso irá fazer o truque exceto para uma confusão poucas exceções (menos de 1%, onde nós podemos ter que usar Ou e E).

Tente não se deixar levar por pessoas mostrando suas lógicas booleanas e fazendo com que pareça uma ciência do foguete.

É muito simples e direto e, ocasionalmente, o sistema pode não funcionar como esperado porque ele não gosta de sua lógica em primeiro lugar. E, no entanto o seu cérebro continua dizendo que sua lógica é 100% testado e comprovado e ele deve funcionar. Naquele ponto exato momento confiando seu cérebro e pedir-lhe para pensar de novo ou (não OrElse ou talvez OrElse) você se obriga a procurar outro emprego que não exija muita lógica.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top