strings - <> Y no en VB.NET
equality operator visual basic (9)
Aquí está la respuesta técnica (ampliando la respuesta de Rowland Shaw).
La palabra clave Is comprueba si los dos operandos son referencias a la misma memoria de objeto, y solo devuelve true si este es el caso. Creo que es funcionalmente equivalente a Object.ReferenceEquals . La palabra clave IsNot es simplemente una sintaxis abreviada para escribir Not ... Is ...
, nada más.
El operador = (igualdad) compara valores y en este caso (como en muchos otros) es equivalente a String.Equals . Ahora, el operador <> (desigualdad) no tiene exactamente la misma analogía que las palabras clave Is y IsNot , ya que se puede sobrescribir por separado del operador = según la clase. Creo que el caso siempre debería ser que devuelva el inverso lógico del operador = (y ciertamente lo es en el caso de String), y solo permite una comparación más eficiente cuando se prueba la desigualdad en lugar de la igualdad.
Cuando trabaje con cadenas, a menos que realmente quiera comparar referencias, use siempre el operador = (o String.Equals, supongo). En su caso, debido a que está probando nulo ( Nada ), parece que necesita usar la palabra clave Is o IsNot (el operador de igualdad fallará porque no puede comparar los valores de los objetos nulos). Sintácticamente, la palabra clave IsNot es un poco más agradable aquí, así que sigue con eso.
Tengo la emocionante tarea de descubrir los operadores <>
y Not
VB.NET. Not
, supongo por mi pequeño uso de él, ¡es el equivalente funcional de !
en lenguajes como C # y <>
equivalentes a !=
.
En VB.NET, un problema común es hacer expresiones booleanas contra objetos que no tienen una referencia, parece. Así que si lo hacemos
If Request.QueryString("MyQueryString") <> Nothing Then
Esto realmente fallará si la cadena de consulta no existe. Por qué, no lo sé. La forma en que lo hacen los codificadores más antiguos es la siguiente:
If Not Request.QueryString("MyQueryString") Is Nothing Then
Y esto tiende a funcionar. Para mí, son funcionalmente equivalentes, aunque los operadores tienden a hacer comparaciones diferentes dependiendo de ciertos factores, como la precedencia del operador, por qué no funciona en este caso, sin embargo, no lo sé, y tampoco he encontrado ningún material relevante.
Pido esto porque tengo que escribir documentación de estándares y estamos determinando el uso del Not
o <>
. ¿Alguna idea sobre cómo debería ser, o debería hacerlo?
Creo que su pregunta se reduce a "la diferencia entre ( Is
y =
) y también ( IsNot
y <>)".
La respuesta en ambos casos es la misma:
=
y <>
se definen implícitamente para los tipos de valor y puede definirlos explícitamente para sus tipos.
Is
y IsNot
están diseñados para comparaciones entre tipos de referencia para verificar si las dos referencias se refieren al mismo objeto.
En su ejemplo, está comparando un objeto de cadena con Nothing (Null) y como los operadores =
/ <>
están definidos para cadenas, el primer ejemplo funciona. Sin embargo, no funciona cuando se encuentra un Nulo porque las cadenas son tipos de referencia y pueden ser Nulos. La mejor manera (como adivinaste) es la última versión usando Is
/ IsNot
.
Los compiladores C # y VB.NET a menudo generan diferentes IL para operaciones que aparentemente son equivalentes en ambos idiomas. Da la casualidad de que C # hace lo "esperado" cuando escribe stringvar == null
, pero VB.NET no lo hace. Para obtener el mismo efecto en VB.NET, debe forzar la verdadera igualdad de referencia con el operador Is
.
Si necesita saber si la variable existe, use Is / IsNot Nothing.
El uso de <> requiere que la variable que está evaluando tenga el operador "<>" definido. Revisa
Dim b As HttpContext
If b <> Nothing Then
...
End If
y el error resultante
Error 1 Operator ''<>'' is not defined for types ''System.Web.HttpContext'' and ''System.Web.HttpContext''.
Siempre he usado lo siguiente:
If Request.QueryString("MyQueryString") IsNot Nothing Then
Pero solo porque sintácticamente se lee mejor.
Al probar una entrada válida de QueryString, también uso lo siguiente:
If Not String.IsNullOrEmpty(Request.QueryString("MyQueryString")) Then
Estos son solo los métodos que siempre he usado, por lo que no podría justificar su uso, aparte de que tienen más sentido para mí al leer el código.
Solo usa lo que suena mejor. Sin embargo, usaría el primer enfoque porque parece tener menos operaciones.
Soy un noob total, vine aquí para averiguar la sintaxis de VB "no es igual a", así que pensé que la incluiría aquí en caso de que alguien más la necesitara:
<%If Not boolean_variable%>Do this if boolean_variable is false<%End If%>
de hecho, el Is es realmente bueno, ya que para los desarrolladores, es posible que desee anular el operador ==, para comparar con el valor. Digamos que tienes una clase A, el operador == de A es comparar algunos de los campos de A con el parámetro. entonces estará en problemas en c # para verificar si el objeto de A es nulo con el siguiente código,
A a = new A();
...
if (a != null)
it will totally wrong, you always need to use if((object)a != null)
but in vb.net you cannot write in this way, you always need to write
if not a is nothing then
or
if a isnot nothing then
que tal como Christian dijo, vb.net no "espera" nada.
Is
no es lo mismo que =
- Is
compara las referencias, mientras que =
compara los valores.
Si está utilizando v2 de .Net Framework (o posterior), está el operador de IsNot
que hará lo correcto y leerá de forma más natural.