2009-06-23 18 views
7

Esta es una pregunta sobre el lenguaje VB.NET. Como lo estoy usando todos los días, solo trato de entender las motivaciones detrás de algunos de sus constructos.Lenguaje VB.NET y Nothing: ¿por qué es así?

acabo entero de que esta línea:

If myObject Is Nothing then 

es tan correcta como ésta es:

If Nothing Is myObject Then 

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

if myObject = null then 

y

if null = myObject then 

Bueno, pero, en VB.NET, no se puede escribir:

if myObject = Nothing Then 

El compilador no aceptará eso.

Mmm, para mí, si no se myObject es mucho más menos evidentes que Si myObject = Nada.

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

+14

Es para asegurarse de que los programadores c sigan odiando a VB. : P –

+0

@Jon: Gracioso. Me gusta. : D –

+0

@Jon: +1 :)! – SRO

Respuesta

25

El problema con el que se está encontrando es que VB.Net diferencia los 2 tipos de comparación de objetos. Es decir, comparación de Referencia y Valor.

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

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

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

+4

Estaba esperando aquí la cuenta regresiva para que vengas y escribas una respuesta. :) Estaba a punto de enviar el mío si tuviste 10 segundos de retraso. –

+0

@Mehrdad, me alegro de presionar Actualizar a tiempo :) – JaredPar

4

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 el operador "Establecer" mientras que los tipos nativos simplemente usaron "=".

3

Bueno, en algunos casos se puede escribir If myObject = Nothing Then, pero no habrá una comparación nulo:

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

El código anterior es equivalente a la siguiente:

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

En este caso tiene un tipo de valor que tiene su valor "emtpy" (0 para 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 .

+0

Sí, acabo de probarlo: puede escribir: "si 2 = Nada, entonces", el compilador simplemente está de acuerdo con eso. Además, como dijiste, "si 0 = nada" siempre es cierto ... Genial, ¡gracias! – SRO

+1

Creo que esta es una parte confusa del lenguaje VB. Para un principiante no está claro que nada signifique "valor predeterminado" para los tipos de valor ... –

1

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

Para mantener un poco de semblencia 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, hubo otros peccadillos similares que no se han trasladado a VB.NET, como la declaración Set para asignar objetos a las variables.

1

Otra idea es que VB está destinado a ser más detallado si se mira parte del bucle 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) 
{ 
} 

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

+0

Bueno, soy un fanático de C, C++, C# que tiene que escribir código usando VB.NET ahora ... :(Pero, todo en resumen, no está nada mal: VB.NET es muy detallado, pero es otro idioma y me divierto tratando de encontrar sus fallas y sus puntos fuertes. Gracias :) – SRO

+0

Experimenté este cambio un par de veces. El primero va de las extensiones C/C++ ISAPI a VBScript en ASP clásico y luego de nuevo pasando de VBScript a C# .Net en ASP.Net, así que he visto esto un par de veces pero he escrito suficiente código en varias versiones de Los lenguajes BASIC y C que puedo cambiar fácilmente. –

+0

Si estamos contando caracteres, ha omitido el paréntesis obligatorio en una sentencia C# if. – MarkJ

Cuestiones relacionadas