Nada es versus nada

130

¿Alguien aquí usa VB.NET y tiene una fuerte preferencia a favor o en contra de usar IsNothingen lugar de Is Nothing(por ejemplo, If IsNothing(anObject)o If anObject Is Nothing...)? Si es así, ¿por qué?

EDITAR: Si crees que ambos son igualmente aceptables, ¿crees que es mejor elegir uno y seguir con él, o está bien mezclarlos?

Luke Girvin
fuente
3
Hay muchas buenas razones para evitar el usoIsNothing()
KyleMit
@JesseChisholm, hay demasiado para un solo comentario, pero mi comentario anterior publicó este enlace a un artículo que enumera 5 diferentes blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
KyleMit
Las respuestas técnicas son realmente interesantes, pero es una pena que la pregunta se haya dejado demasiado abierta y generó algunas respuestas sin uso, solo preferencias vagas cada vez más vagas
subrayado_d

Respuestas:

125

Si observa el MSIL mientras se ejecuta, verá que no se compila exactamente con el mismo código. Cuando usa IsNothing () en realidad realiza una llamada a ese método en lugar de solo evaluar la expresión.

La razón por la que tendería a inclinarme hacia el uso de "Is Nothing" es cuando niego que se convierta en "IsNot Nothing 'en lugar de" Not IsNothing (object) ", que personalmente siento que parece más legible.

lomaxx
fuente
46

Me parece que Patrick Steele respondió a esta pregunta mejor en su blog: Avoiding IsNothing ()

No copié ninguna de sus respuestas aquí, para asegurarme de que Patrick Steele reciba el crédito por su publicación. Pero creo que si intentas decidir si usar Is Nothing o IsNothing no deberías leer su publicación. Creo que estarás de acuerdo en que Is Nothing es la mejor opción.

Editar - Comentario de VoteCoffe aquí

Contenido parcial del artículo: después de revisar más código descubrí otra razón por la que debería evitar esto: ¡acepta tipos de valor! Obviamente, dado que IsNothing () es una función que acepta un 'objeto', puede pasarle lo que quiera. Si se trata de un tipo de valor, .NET lo encuadrará en un objeto y lo pasará a IsNothing, ¡que siempre devolverá falso en un valor encuadrado! El compilador de VB.NET verificará la sintaxis de estilo "Is Nothing" y no compilará si intenta hacer un "Is Nothing" en un tipo de valor. Pero la función IsNothing () se compila sin quejas. -PSteele - VoteCoffee

Jack Snipes
fuente
77
Contenido parcial del artículo: después de revisar más código descubrí otra razón por la que debería evitar esto: ¡acepta tipos de valor! Obviamente, dado que IsNothing () es una función que acepta un 'objeto', puede pasarle lo que quiera. Si se trata de un tipo de valor, .NET lo encuadrará en un objeto y lo pasará a IsNothing, ¡que siempre devolverá falso en un valor encuadrado! El compilador de VB.NET verificará la sintaxis de estilo "Is Nothing" y no compilará si intenta hacer un "Is Nothing" en un tipo de valor. Pero la función IsNothing () se compila sin quejas. -PSteele
VoteCoffee
77
Publiqué algunos de los contenidos como nunca se sabe si el enlace se desactivará y pensé que agregaba un buen punto a la portada.
VoteCoffee
33

Debe evitar absolutamente usar IsNothing()

Aquí hay 4 razones del artículo IsNothing () VS Is Nothing

  1. Lo más importante IsNothing(object)es que todo le ha pasado como un objeto, ¡incluso los tipos de valor! Dado que los tipos de valor no pueden ser Nothing, es una verificación completamente desperdiciada.
    Tome el siguiente ejemplo:

    Dim i As Integer
    If IsNothing(i) Then
       ' Do something 
    End If

    Esto compilará y funcionará bien, mientras que esto:

    Dim i As Integer
    If i Is Nothing Then
        '   Do something 
    End If

    No se compilará, en su lugar, el compilador generará el error:

    El operador 'Es' no acepta operandos de tipo 'Entero'.
    Los operandos deben ser de referencia o tipos anulables.

  2. IsNothing(object)en realidad es parte de parte de la Microsoft.VisualBasic.dll.
    Esto no es deseable ya que tiene una dependencia innecesaria de la biblioteca VisualBasic.

  3. ¡Es lento - 33.76% más lento de hecho (más de 1000000000 iteraciones)!

  4. Quizás preferencia personal, pero se IsNothing()lee como una condición de Yoda . Cuando observas una variable, estás verificando su estado, siendo el tema de tu investigación.

    es decir, hace que hacer x? --- NO ¿Es xuna propiedad de él ?

    Así que creo que se If a IsNot Nothinglee mejor queIf Not IsNothing(a)

KyleMit
fuente
29

Estoy de acuerdo con "Is Nothing". Como se indicó anteriormente, es fácil negarlo con "IsNot Nothing".

Esto me resulta más fácil de leer ...

If printDialog IsNot Nothing Then
    'blah
End If

que esto...

If Not obj Is Nothing Then
    'blah
End If
proudgeekdad
fuente
5

VB está lleno de cosas como esa que intentan que sea "como el inglés" y cómodo para las personas que están acostumbradas a los idiomas que usan () y {} mucho. Por ejemplo, en el lado "me gusta el inglés" ... VB tiene la palabra clave " Ain't " ... y no, no estoy bromeando. Y por otro lado, como probablemente ya sepa la mayor parte del tiempo, puede usar () con llamadas a funciones si lo desea, pero no tiene que hacerlo.

Prefiero IsNothing () ... pero uso C y C #, así que eso es lo que es cómodo. Y creo que es más legible. Pero ve con lo que te parezca más cómodo.

Adam Haile
fuente
3
Su enlace está muerto, por lo que vale la pena aquí: live.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08/… Sin embargo, vale la pena señalar que, contrariamente a la creencia popular, esto es no es verdad.
Matt Wilko
5

Me estoy inclinando hacia la alternativa "Is Nothing", principalmente porque parece más OO.

Seguramente Visual Basic no tiene la palabra clave Ain't.

tiempo muerto
fuente
¿Puede VB.NET hacer métodos de extensión? :)
klkitchens
2

También tiendo a usar la versión Is Nothing parcialmente por usarla tanto como lo hago en SQL.

Brian Childress
fuente
1

Inicialmente usé IsNothing, pero me he movido hacia el uso de Is Nothing en proyectos más nuevos, principalmente por legibilidad. El único momento en que me quedo con IsNothing es si mantengo el código donde se usa y quiero mantener la coherencia.

Chris Tybur
fuente
-2

Is Nothing requiere un objeto que se haya asignado al valor Nothing. IsNothing () puede tomar cualquier variable que no se haya inicializado, incluso de tipo numérico. Esto es útil, por ejemplo, cuando se prueba si se ha pasado un parámetro opcional.

ybacou
fuente
Esto está mal. ¿Estás seguro de que no lo entendiste al revés? " IsNothing está destinado a trabajar en tipos de referencia. Un tipo de valor no puede contener un valor de Nothing y vuelve a su valor predeterminado si asigna Nothing [...] IsNothing siempre devuelve False ". Pero "representa el valor predeterminado de cualquier tipo de datos. [...] Para los tipos de valor, [esto] depende de si el tipo de valor es anulable". ¿Entonces no es mejor? Nothing Is Nothing
underscore_d