No VB.NET, qual é a diferença entre And
e AndAlso
? Qual devo usar?
vb.net
short-circuiting
Nakul Chaudhary
fonte
fonte
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:Verifica se x é igual a 5 e se y é igual a 7, continua se ambos forem verdadeiros.
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:
Se usado em
And
vez deAndAlso
, ainda tentaria,Object.Load()
mesmo que fossenothing
, o que geraria uma exceção.fonte
and
/ aor
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
eOr
no VB.NET são operadores de bitsOrElse
eAndAlso
são estritamente operadores booleanos.Nota : um número inteiro diferente de zero é considerado
true
;Dim e = not 0
definidoe
como-1
demonstrativoNot
também é um pouco operador.||
e&&
(as versões C # deOrElse
eAndAlso
) retornam a última expressão avaliada que seria3
e5
respectivamente. Isso permite que você use o idiomav || 5
em C # para fornecer5
como o valor da expressão quandov
énull
ou (0
e um número inteiro) e o valor dev
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
eAnd
para operações de bit (inteiro ou booleano). UseOrElse
eAndAlso
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?
fonte
||
e&&
com??
. Enquanto existem línguas onde||
irá devolver o valor não Falsey, C # não é um deles, e retorna umbool
(exceto para os operadores anuláveis levantadas, onde você obtém umNullable<bool>
resultado)Avalia Bool1 e Bool2
Avalia Bool2 se e somente se Bool1 for verdadeiro.
fonte
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.
O uso de
And
garante que uma linha seja consumida toda vez que a condição for verificada. Considerando queAndAlso
pode ler a última linha deFile1
e sairFile2
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.
fonte
Uma maneira simples de pensar sobre isso é usar um inglês ainda mais claro
fonte
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:
O uso da antiga E na expressão acima geraria uma NullReferenceException se myObj fosse nulo.
fonte
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.
fonte
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.
fonte
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.
fonte
Para entender com palavras, não com bacalhau:
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.
fonte