Nada es igual String.Empty, null no es igual a String.Empty, lo que me estoy perdiendo aquí?
-
01-10-2019 - |
Pregunta
En un proyecto de código mixto (VB y C #) nos depuración algún viejo código de Visual Basic siguiente:
If Request.Params("xxx") <> "" Then
'do something
Me considera esto un error que podría ser Request.Params null
, en cuyo caso la declaración falsa habría convertido en lo que no era la idea.
Así que. Me acabo de enterar - una vez más - que Nothing
de VB y C # null
's no no son las mismas cosas y Nothing
es la misma que null
. De hecho:
if(String.Empty == null) // in C# this is always false (correct)
If String.Empty = Nothing Then ' in VB this is always true (????)
¿Cómo es esto posible? ¿Esto es una cuestión de compatibilidad con versiones anteriores?
Solución
Nothing
tiene un significado especial en VB para cuerdas. Para comprobar si una cadena de referencia es nulo, es necesario:
If value Is Nothing
Desde el VB documentación operadores de comparación :
comparaciones numéricas tratan Nada como 0. Las comparaciones de cadenas tratan Nada como "" (una cadena vacía).
Sospecho que esto es sólo para la compatibilidad con Visual Basic 6 -. No es algo que yo sería feliz, si yo fuera un desarrollador VB
Comparación A del formulario
If value = Nothing
se compila a una llamada a Microsoft.VisualBasic.CompilerServices.Operators.CompareString
que devuelve 0 (es decir, igual) Si un operando es nulo y el otro es vacía.
Otros consejos
En Visual Basic 6, el valor predeterminado de una variable de cadena era una cadena vacía. Un programador VB6 confiar en tal comportamiento no sería "peor" que un programador C confiando en caso de incumplimiento de cero inicialización de variables int; ambos comportamientos se especifican como parte del lenguaje.
Además, en el documento COM (el marco sobre el cual se basan las versiones anteriores de Visual Basic 6), cada vez que se crea una referencia a la secuencia, alguien tendría que disponer de ella de forma manual. Ya que la cadena más utilizado fue la cadena vacía, muchos métodos COM están documentadas explícitamente como con respecto a un puntero nulo como equivalente a una cadena vacía. Esto significa que una función que devuelve una cadena vacía o que pasan uno como un parámetro de valor o que vuelven uno puede simplemente pasar un puntero nulo sin tener que asignar nada; el destinatario del puntero nulo entonces no tendrá que desasignar nada.
Dado que los objetos en .NET no requieren cancelación de asignación explícita, ya no se aplican las ventajas de rendimiento de respecto a una referencia nula como una cadena vacía. Sin embargo, los métodos que se llaman de código que podría esperar un comportamiento similar al de los métodos COM se consideran a menudo referencias cadena nula como la misma como cadenas vacías.
¿Quieres
If Not String.IsNullOrEmpty(Request.Params("xxx") Then
...
End If
o
if (!String.IsNullOrEmpty(Request.Params("xxx")) {
...
}