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

¿Fue útil?

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