que - visual c#
C#vs VB.NET-Manejo de estructuras nulas (5)
Además, las estructuras son tipos de valor (muy parecido a int, char, etc.) y, por lo tanto, no aceptan nulos.
Me encontré con esto y me preguntaba si alguien podría explicar por qué esto funciona en VB.NET cuando esperaría que falle, 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?
¿Nada es lo mismo que nulo ( Nothing! = Null - LOL?) , ¿O se trata de 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?
[Actualizar]
Teniendo en cuenta algunos de los comentarios, me equivoqué un poco más con esto ... parece como si realmente tuvieras que usar Nullable si quieres permitir que algo sea nulo en VB.NET ... así que 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''
Muy raro...
Debido a que una estructura se compone posiblemente de varios tipos diferentes (no un solo tipo de valor, sino un posible compuesto de varios tipos diferentes), 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 prueba, es decir, con una estructura que tiene todos sus miembros componentes en sus respectivos valores "Nada", 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
Si mal no recuerdo, ''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.
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 puede asignarse nulo ya que ... es un valor.
Sin embargo, al buscar en la palabra clave "Estructura" de VB.NET, no dice "Tipo de valor". En cambio, dice
La instrucción Structure 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 ninguno.
Nothing
es más o menos equivalente al default(T)
para el tipo relevante. (Simplemente marcado, y esto también se aplica a las cadenas, es decir, Nothing
es una referencia nula en el contexto de cadenas).