C # vs VB.NET - Handling de Estruturas nulos
Pergunta
Eu corri em toda esta e queria saber se alguém poderia explicar por que isso funciona em VB.NET quando eu esperaria que ele deve falhar, assim como ele faz em 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
Mas, em seguida, em VB.NET ...
Structure Person
Public name As String
End Structure
...
Dim someone As Person = Nothing 'Wha? this is okay?
não é nada não é o mesmo como nula ( Nada = null -!? LOL)? , ou é apenas diferentes maneiras de lidar com a mesma situação entre as duas línguas
Por que ou o que é tratado de forma diferente entre os dois que torna este bem em um, mas não o outro?
[Update]
Dado alguns dos comentários, eu errei com isso um pouco mais ... parece que você realmente tem que usar Nullable se você quiser permitir que algo a ser nula em VB.NET ... assim, por exemplo .. .
'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'
Muito estranho ...
Solução
Se bem me lembro, 'nada' em meio VB "o valor padrão". Para um tipo de valor, que é o valor padrão para um tipo de referência, que seria nula. Assim, a atribuição de nada para um struct, não é nenhum problema em tudo.
Outras dicas
Nothing
é aproximadamente equivalente a default(T)
para o tipo relevante. (Basta verificar, e isso é verdade para cordas, bem como -. Ou seja Nothing
é uma referência nula no contexto de strings)
Eu tentei procurar por ele no MSDN, mas não consegui encontrar nada relevante no lado do VB. Ao procurar por "struct" em C #, claramente retornos que é um tipo de valor e não podem ser atribuídos nula uma vez ... é um valor.
No entanto, quando se olha em VB.NET palavra-chave "Estrutura" não diz "Valor Tipo". Em vez disso, diz
A declaração Estrutura define um tipo composto valor que você puder customize.
Então ... objeto?
Isso seria o meu palpite. Eu gostaria de ter referências a este comportamento, mas não conseguiu encontrar nenhum.
Além disso, estruturas são tipos de valor (bem como int, carvão animal, etc.) e, portanto, são não-nulo.
Porque uma estrutura é composta de, possivelmente, vários tipos diferentes (nem um único valor Tipo, mas um possível composto de diversos tipos diferentes), para perguntar se ele é "Nothing" iria quebrar a lógica do uso de um "Nada" . testes nada diferente, dependendo do tipo que você está testando e, portanto, um tipo complexo não adere à lógica do uso de um "Nada". No entanto, para este tipo de teste, isto é, com uma estrutura com todos os seus membros componentes os seus respectivos valores de "nada", que utilizam a função de "IsNothing". Por exemplo:
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