Me encontré con esto y me preguntaba si alguien podría explicar por qué esto funciona en VB.NET cuando yo esperaría que en caso de fallar, igual que se hace 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, a continuación, en VB.NET…

Structure Person
    Public name As String
End Structure
...
Dim someone As Person = Nothing 'Wha? this is okay?

No es Nada no es la misma como null (Nada != null – LOL?), o se trata simplemente de diferentes formas de manejo de la misma situación entre los dos idiomas?

Por qué, o qué es manejado de manera diferente entre los dos, que hace que este bien en uno, pero el otro no?

[Actualización]

Dado algunos de los comentarios, he metido con esto un poco más… parece como si en realidad tienes que utilizar acepta valores null si desea permitir que algo sea nulo en VB.NET… 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…

  • Me tropecé a través mientras que trasladar algunos VB.NET a C# – me hace odiar VB.NET que mucho más ;). Gracias por la excavación en esto, y gracias a los que respondieron.
  • Véase también stackoverflow.com/questions/5869661/…
  • debo odiar a C#, por ser diferente de VB? Algunas de las personas a resolver problemas. Parte de la culpa idiomas por ser diferente.
InformationsquelleAutor Hugoware | 2008-11-19

5 Comentarios

  1. 30

    Si recuerdo correctamente, ‘Nada’ en VB significa el «valor predeterminado». Para un tipo de valor, que es el valor predeterminado para un tipo de referencia, que sería nulo. Por lo tanto, la asignación de la nada a una estructura, no es ningún problema en absoluto.

    • Muy interesante
    • Muy interesante de verdad! Así que, en este caso: Nothing no es Nothing
  2. 12

    Nothing es aproximadamente equivalente a default(T) para el tipo correspondiente. (Acabo de comprobar, y esto es cierto para las cadenas así – es decir, Nothing es una referencia nula en el contexto de las cadenas.)

    • Sí, pero la última vez que lo comprobé, la cadena vacía es también Nada. Ya sea IsNothing("") o "" Is Nothing devuelve True. Tal vez ambos. Si no es tanto, la discrepancia es terrible.
  3. 1

    Traté de buscarlo en la web de MSDN, pero no podía encontrar nada relevante en la VB lado. Cuando la búsqueda para «struct» en C#, es evidente que devuelve que es un Tipo de Valor y no se puede asignar null ya que… es un valor.

    Sin embargo, cuando se mira en VB.NET la palabra «Estructura» no dice «Tipo de Valor». En lugar de ello, dice

    La Estructura de la declaración define un
    compuesto de tipo de valor que puede
    personalizar.

    Así que… objeto?

    Que sería mi suposición. Me gustaría tener referencias a este comportamiento, pero no pudo encontrar ninguna.

    • No, el objeto sería Class , que es null como valor predeterminado. La estructura es un complejo tipo de valor que puede ser construido de varios valores, e incluso métodos. La diferencia práctica para Class es que Structure se inicializa con una instancia real. Inicializarla con Nothing sólo especifica que se debe ajustar a su valor por defecto, que NO es nulo (o como solemos decir en VB: Nada)
  4. 0

    También, las estructuras son tipos de valor (como int, char, etc.) y por lo tanto no los aceptan.

    • Bien el uso que aceptan valores null o ? (C#), usted puede hacer una estructura null. Es por eso que yo estaba tan sorprendido cuando se trabajó con VB.NET sin necesidad de utilizar los aceptan.
    • El uso de valores null, usted puede hacer CUALQUIER cosa null! Incluso un Integer. Yo estaba asombrado por la aceptó responder por Alibres, y por suerte ella respondió a mi pregunta que me llevó a este post: ¿Cómo se puede inicializar una Estructura con su valor predeterminado… 😉
  5. -1

    Debido a que una Estructura se compone de, posiblemente, varios Tipos diferentes (no un solo Tipo de valor, pero un posible compuesto de varios tipos diferentes), para preguntar si es «Nada» sería romper la lógica de la utilización de la «Nada». Nada de pruebas de forma diferente dependiendo del tipo de prueba y, por tanto, un tipo complejo no se adhiere a la lógica de la utilización de la «Nada». Sin embargo, para este tipo de pruebas, es decir, con una estructura que tiene todos sus miembros en sus respectivas «Nada» de los valores, se utiliza la función «IsNothing». 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
    • IsNothing(Empleado) nunca va a evaluar a ‘true’, porque el tipo no acepta valores null

Dejar respuesta

Please enter your comment!
Please enter your name here