2010-01-08 11 views

Respuesta

8

La única solución para utilizar Or es cuando se quiere bit a bit aritmética, es decir, se quiere manipular los bits en un número:

Sub SetBit(value As Integer, Bit As Integer) 
    value = value Or (1 << Bit) 
End Sub 

Este tipo es el único caso apropiado para Or. En todos los demás casos (es decir, cuando se usa lógica booleana), use OrElse.

A pesar de sus nombres similares, Or y OrElse son semánticamente operaciones bastante distintas que no deben confundirse entre sí. Resulta que la representación interna de Boolean s hace posible usar bitwise Or para lograr un efecto similar (pero no el mismo) a OrElse. (. Las versiones antiguas de BASIC y VB .NET - antes - explotados por esta relación única proporcionar una operación Or, sin OrElse)

+1

Konrad tiene razón, pero si desea leer más sobre esto desde el desarrollador anterior del lenguaje VB, puede consultar el artículo de Paul Vick http://www.panopticoncentral.net/archive/2003/08/18/179 .aspx –

+0

@ChrisHaas Desafortunadamente @PaulV ha decidido [eliminar sus antiguas publicaciones en el blog] (http://panopticoncentral.net/2011/03/29/external-requests-versus-internal-requirements/), por lo que ahora es un enlace muerto. –

+0

¡Eh, ni siquiera sabía que se había ido de Microsoft! –

2

Editar: Este código es mal; Simplemente agregué esta respuesta para indicar que esto es posible.

Otro caso sería el uso de O al evaluar expresiones que realizan algún tipo de efecto secundario que deben ocurrir:

Sub DoSomething() 
    Dim succeeded As Boolean 
    succeeded = FirstThing() Or SecondThing() Or ThirdThing() 
    If succeeded Then 
     ' Do something here 
    End If 
End Sub 

En este caso firstthing, SecondThing y ThirdThing son métodos que se deben ejecutar en su totalidad si alguno de ellos falla o no, al acumular un valor de éxito. Si usó OrElse, entonces si FirstThing o SecondThing fallan, entonces las operaciones detrás del método fallido no ocurrirían.

+2

Espero que te des cuenta de que este código es malo. Si desea los efectos secundarios, haga las comparaciones secuencialmente. El código anterior está bastante oculto: por mi parte, de inmediato pensaría que es un error y no fue intencionado. –

+1

+1 porque su respuesta es correcta, pero estoy de acuerdo con Konrad, ¡no es una buena práctica hacerlo! –

+1

No me malinterpreten, ¡no estoy abogando por esto en lo más mínimo! –

3

Siempre debe usar OrElse en lugar de O, excepto al hacer aritmética de bits.

OrElse es una comparación de cortocircuito, lo que significa que no evaluará la segunda cláusula si la primera fuera verdadera. Esto es extremadamente útil, porque a menudo querrás cláusulas que podrían fallar sin cortocircuito (por ej., X no es nada OrElse no x.HasSomeProperty).

La razón por la que no es posible actualizar automáticamente todas las 'Or como' OrElse es porque la evaluación de la segunda cláusula puede ser importante. Por ejemplo, podría escribir "True or SomeBooleanMethodWhichMightThrowAnEception()". Cambiar eso O a un OrElse cambiaría el significado del programa.

Cuestiones relacionadas