2008-11-19 28 views
23

me encontré con esto y me preguntaba si alguien podría explicar por qué esto funciona en VB.NET cuando yo esperaría que fallara, al igual que lo hace en C#C# y VB.NET - Tratamiento de Estructuras nulos

//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 entonces en VB.NET ...

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

hay nada no es lo mismo como nulo (Nada = null -!? LOL), o se trata simplemente diferentes maneras de manejar la misma situación entre el ¿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?

[Actualización]

dado algunos de los comentarios, me metió con esto un poco más ... parece como si realmente tiene que utilizar anular si desea permitir que algo sea nula 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 extraño ...

+0

Acabo de tropezar mientras transportaba algunos VB.NET a C# - me hace odiar a VB.NET que mucho más;). Gracias por profundizar en esto, y gracias a aquellos que respondieron. – Charles

+0

Vea también http://stackoverflow.com/questions/5869661/why-can-i-not-check-if-datetime-is-nothing – jeroenh

+0

@Charles, ¿Debería odiar C# por ser diferente de VB? Algunas personas resuelven problemas. Algunos culpan a los idiomas por ser diferentes. – Dima

Respuesta

30

si no recuerdo mal, 'Nada' en VB significa "el valor por defecto". 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.

+0

Muy interesante – Hugoware

+4

¡Muy interesante! Entonces en este caso: 'Nothing' no es' Nothing' ... – awe

12

Nothing es aproximadamente equivalente a default(T) para el tipo relevante. (Solo se ha comprobado, y esto también se aplica a las cadenas, es decir, Nothing es una referencia nula en el contexto de cadenas.)

+2

Sí, pero la última vez que lo revisé, la cadena vacía también es Nothing. O bien 'IsNothing (" ")' o '" "Is Nothing' devuelve' True'. Tal vez son las dos cosas. Si no son ambas cosas, entonces la discrepancia es terrible. – Phong

0

Además, las estructuras son tipos de valores (muy similares a int, char, etc.) y por lo tanto no -nullible

+0

¿Bien usando Nullable o? (C#), puedes hacer una estructura nula. Es por eso que estaba tan sorprendido cuando funcionaba con VB.NET sin usar Nullable. – Hugoware

+1

@HBoss: ¡Usando nullable, puedes hacer CUALQUIER COSA nulo! Incluso un 'Entero '. Me sorprendió la respuesta aceptada por ** BFree **, y afortunadamente respondió mi pregunta que me llevó a esta publicación: ¿Cómo se puede inicializar una Estructura con su valor predeterminado ...;) – awe

1

Traté de buscarlo en MSDN pero no pude encontrar nada relevante en el lado 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 VB.NET "Estructura", no dice "Tipo de valor". En su lugar, dice

La declaración define una estructura compuesta tipo de valor que pueda personalizar.

So ... object?

Esa sería mi suposición. Me gustaría tener referencias a este comportamiento pero no pude encontrar ninguno.

+0

No, el objeto sería ' Class', que es nulo por defecto. La estructura es un tipo de valor complejo que se puede construir a partir de varios valores, e incluso métodos. La diferencia práctica para 'Class' es que' Structure' se inicializa con una instancia real. Inicializarlo con 'Nothing' simplemente especifica que se debe establecer en su valor predeterminado, que NO es nulo (o como solemos decir en VB: Nothing) – awe

0

Dado que una estructura se compone posiblemente de varios tipos diferentes (no un solo valor Type, sino un posible compuesto de varios tipos diferentes), preguntar si es "Nothing" rompería la lógica del uso de "Nothing ". 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