Nada es igual String.Empty, null no es igual a String.Empty, lo que me estoy perdiendo aquí?

StackOverflow https://stackoverflow.com/questions/3131134

  •  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.

pensé

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?

¿Fue útil?

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")) {
    ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top