VB.NET - No es nada contra no es nada


¿Alguien aquí usa VB.NET y tiene una fuerte preferencia por o en contra de usar IsNothing en 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?

Author: Mark Hurd, 2008-08-08

9 answers

Si echas un vistazo al MSIL mientras se está ejecutando verás que no compila exactamente el mismo código. Cuando usas IsNothing () realmente hace 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 "No es nada" es cuando estoy negando que se convierte en "No es nada "en lugar de" No es nada(objeto)", que personalmente siento que se ve más legible.

 113
Author: lomaxx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 12:28:37

Encuentro que Patrick Steele respondió esta pregunta mejor en su blog: Evitar es nada()

No copié nada de su respuesta aquí, para asegurar que Patrick Steele obtenga el crédito por su publicación. Pero creo que si estás tratando de decidir si usar Es Nada o no es nada deberías leer su post. Creo que estarás de acuerdo en que Nada es la mejor opción.

 40
Author: Jack Snipes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-11 14:12:57

Estoy de acuerdo con "No es nada". Como se indicó anteriormente, es fácil negar con "IsNot Nothing".

Encuentro esto 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
 27
Author: proudgeekdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 13:11:51

Usted debe evitar absolutamente el uso de IsNothing()

Aquí están 4 razones del artículo IsNothing () VS Is Nothing

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

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

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

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

    No compilará, en lugar de el compilador generará el error:

    'Es' operador no acepta operandos de tipo 'Integer'.
    Los operandos deben ser tipos reference o nullable.

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

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

  4. Tal vez preferencia personal, pero IsNothing() se lee como un Condición Yoda. Cuando nos fijamos en una variable que está comprobando su estado, con él como el tema de su investigación.

    I. e. does it do x? --- NO Es xing una propiedad de ?

    Así que creo que If a IsNot Nothing lee mejor que If Not IsNothing(a)

 27
Author: KyleMit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-30 16:07:10

VB está lleno de cosas como esa tratando de que sea "como el inglés" y cómodo para las personas que están acostumbradas a idiomas que usan () y {} mucho. Por ejemplo, en el lado"like english"...VB tiene la palabra clave" No es"...y no, no estoy bromeando. Y por otro lado, como probablemente ya sabes la mayor parte del tiempo, puedes usar () con llamadas a funciones si quieres, pero no tienes que hacerlo.

Prefiero IsNothing()...pero uso C y C#, así que eso es justo lo que es cómodo. Y yo creo que es más legible. Pero ir con lo que se siente más cómodo para usted.

 6
Author: Adam Haile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 09:49:51

Me inclino hacia la alternativa "No es nada", principalmente porque parece más OO.

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

 6
Author: deadtime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 10:57:27

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

 2
Author: Brian Childress,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 12:29:25

Inicialmente usé IsNothing, pero me he estado moviendo hacia el uso de Is Nothing en proyectos más nuevos, principalmente para la legibilidad. La única vez que me quedo con IsNothing es si estoy manteniendo el código donde se utiliza en todo y quiero permanecer consistente.

 1
Author: Chris Tybur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-08 13:24:51

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

 -2
Author: ybacou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-06 04:23:28