Pregunta

Esta es una pregunta sobre el lenguaje VB.NET. Como lo uso todos los días, solo trato de entender las motivaciones detrás de algunos de sus constructos.

Acabo de descubrir que esta línea:

If myObject Is Nothing then

es tan correcto como este:

If Nothing Is myObject Then

Los mismos resultados. Usando ildasm, podemos ver que estas líneas se traducen a:

if myObject = null then

y

if null = myObject then

Bueno, pero, en VB.NET, no puedes escribir:

if myObject = Nothing Then

El compilador no aceptará eso.

Mmm, para mí, Si Nothing Is myObject es mucho menos obvio que If myObject = Nothing .

¿Por qué los autores de VB.NET simplemente piensan lo contrario? ¿Alguna pista?

¿Fue útil?

Solución

El problema con el que se encuentra es que VB.Net diferencia los 2 tipos de comparación de objetos. A saber, referencia y comparación de valores.

El " Es " El operador en VB.Net se utiliza para la comparación de referencia. Esto se puede usar cuando los valores en cuestión son tipos de referencia o nulos. Intentar comparar tipos de valores de esta manera dará como resultado un error de compilación.

El " = " El operador se utiliza para la comparación de valores. La comparación de valores solo se puede usar en tipos que definen un explícito =, & Lt; & Gt; par de operadores en su definición de clase. La implementación real de la igualdad depende de la implementación del operador.

C # adopta un enfoque diferente en el sentido de que utiliza == tanto para el valor como para la comparación de referencia. El uso depende de un par de factores, incluido el tipo de valores que se comparan y la implementación de ciertos métodos de igualdad.

Otros consejos

Es una de estas cosas heredadas de VB6 y COM. VB6 hace una distinción entre objetos de tipo de referencia (que son instanciables) y tipos nativos como int. Los tipos de referencia tuvieron que ser creados y asignados con & Quot; Set & Quot; operador, mientras que los tipos nativos simplemente usaban " = " ;.

Bueno, en algunos casos puedes escribir If myObject = Nothing Then, pero no será una comparación nula:

Dim someValue As Integer
If someValue = Nothing Then
    ' do something '
End If

El código anterior es equivalente a lo siguiente:

Dim someValue As Integer
If someValue = 0 Then
    ' do something '
End If

En este caso, tiene un tipo de valor que tiene su " emtpy " valor (0 para un Integer, Point.Empty para una estructura Point como ejemplos). El operador Is realiza una comparación de referencia (verificando si los objetos comparados son la misma instancia), mientras que el signo igual es una comparación de valores .

Otra idea es que VB pretende ser más detallado si observamos algunos de los bucles y la sintaxis condicional. Un par de ejemplos:

VB:

If x==0 Then
End If

While 
End While

For i = 0 to 10 Step 2
Next i

C #

 If x==0 
 {
 }

 While 
 {
 }

 for (int i = 0; i<=10;i+2)
 {
 }

¿Ves todas las palabras adicionales en el código VB.Net? Esa es otra posible razón de la diferencia.

El uso de Is Nothing es una construcción que se remonta a los días de Visual Basic clásico (es decir, 6.0 y versiones posteriores).

Para mantener cierta similitud de compatibilidad (al igual que la forma en que VB6 maneja la evaluación no perezosa de la declaración If), esto se ha trasladado a VB.NET.

Afortunadamente como ocdecio señala que hubo otros pecadillos similares que no se han llevado a VB.NET, como la instrucción Set para asignar objetos a variables.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top