C # vs VB.NET - Manejo de estructuras nulas
Pregunta
Me encontré con esto y me preguntaba si alguien podría explicar por qué esto funciona en VB.NET cuando esperaría que fallara, al igual que en C #
//The C# Version
struct Person {
public string name;
}
...
Person someone = null; //Nope! Can't do that!!
Person? someoneElse = null; //No problem, just like expected
Pero luego en VB.NET ...
Structure Person
Public name As String
End Structure
...
Dim someone As Person = Nothing 'Wha? this is okay?
¿No es nada lo mismo que nulo ( Nothing! = null - LOL?) , ¿o son formas diferentes de manejar la misma situación entre los dos idiomas?
¿Por qué o qué se maneja de manera diferente entre los dos que hace que esto esté bien en uno, pero no en el otro?
[Updatefont>
Teniendo en cuenta algunos de los comentarios, me metí un poco más en esto ... parece que realmente tienes que usar Nullable si quieres permitir que algo sea nulo en VB.NET ... así, por ejemplo ... .
'This is false - It is still a person'
Dim someone As Person = Nothing
Dim isSomeoneNull As Boolean = someone.Equals(Nothing) 'false'
'This is true - the result is actually nullable now'
Dim someoneElse As Nullable(Of Person) = Nothing
Dim isSomeoneElseNull As Boolean = someoneElse.Equals(Nothing) 'true'
Demasiado raro ...
Solución
Si no recuerdo mal, 'Nothing' en VB significa " el valor predeterminado " ;. Para un tipo de valor, ese es el valor predeterminado, para un tipo de referencia, que sería nulo. Por lo tanto, no asignar nada a una estructura no es un problema en absoluto.
Otros consejos
Nothing
es más o menos equivalente a default (T)
para el tipo relevante. (Solo se verificó, y esto también es cierto para las cadenas, es decir, Nothing
es una referencia nula en el contexto de las cadenas).
Traté de buscarlo en MSDN pero no pude encontrar nada relevante en el lado de VB. Al buscar " struct " en C #, claramente devuelve que es un Tipo de valor y no se puede asignar nulo ya que ... es un valor.
Sin embargo, cuando se busca en la palabra clave VB.NET " Estructura " no dice "Tipo de valor". En cambio dice
La instrucción Estructura define un tipo de valor compuesto que puede personalizar.
Entonces ... ¿objeto?
Esa sería mi suposición. Me gustaría tener referencias a este comportamiento, pero no pude encontrar ninguna.
Además, las estructuras son tipos de valores (muy parecidos a int, char, etc.) y, por lo tanto, no son anulables.
Debido a que una Estructura está compuesta posiblemente por varios Tipos diferentes (no un Tipo de valor único, sino un posible compuesto de varios tipos diferentes), para preguntar si es " Nada " rompería la lógica del uso de "Nada". Nada prueba de manera diferente según el tipo que esté probando y, por lo tanto, un tipo complejo no se adhiere a la lógica del uso de "Nada". Sin embargo, para este tipo de pruebas, es decir, con una estructura que tiene todos sus miembros componentes en sus respectivos '' Nada '' valores, usamos la función "No es nada". Por ejemplo:
Public Class Employees
Public Structure EmployeeInfoType
Dim Name As String ' String
Dim Age as Integer ' Integer
Dim Salary as Single ' Single
End Structure
Private MyEmp as New EmployeeInfoType
Public Function IsEmployeeNothing(Employee As EmployeeInfoType) As Boolean
If **IsNothing**(Employee) Then
Return True
Else
Return False
End If
End Function
End Class