C # vs VB.NET - Gestione di strutture null
Domanda
Mi sono imbattuto in questo e mi chiedevo se qualcuno potesse spiegare perché questo funziona in VB.NET quando mi aspetterei che dovrebbe fallire, proprio come succede in 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
Ma poi in VB.NET ...
Structure Person
Public name As String
End Structure
...
Dim someone As Person = Nothing 'Wha? this is okay?
Niente non è lo stesso di null ( Nothing! = null - LOL?) , o sono solo modi diversi di gestire la stessa situazione tra le due lingue?
Perché o cosa viene gestito in modo diverso tra i due che rendono tutto ok in uno, ma non nell'altro?
[Aggiornamento]
Dati alcuni dei commenti, ho rovinato un po 'di più questo ... sembra che tu debba effettivamente usare Nullable se vuoi permettere che qualcosa sia nullo in VB.NET ... quindi per esempio .. .
'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'
Troppo strano ...
Soluzione
Se ricordo correttamente, "Niente" in VB significa "il valore predefinito". Per un tipo di valore, questo è il valore predefinito, per un tipo di riferimento, sarebbe nullo. Pertanto, l'assegnazione di nulla a una struttura non è affatto un problema.
Altri suggerimenti
Nothing
equivale approssimativamente a default (T)
per il tipo pertinente. (Ho appena controllato, e questo vale anche per le stringhe, ovvero Nothing
è un riferimento null nel contesto delle stringhe.)
Ho provato a cercarlo su MSDN ma non ho trovato nulla di rilevante sul lato VB. Durante la ricerca di " struct " su C #, restituisce chiaramente che è un Tipo valore e non può essere assegnato null poiché ... è un valore.
Tuttavia, quando si osserva la parola chiave VB.NET " Struttura " non dice " Tipo valore " ;. Invece dice
L'istruzione Structure definisce a tipo di valore composito che è possibile personalizzare.
Quindi ... oggetto?
Sarebbe la mia ipotesi. Vorrei avere riferimenti a questo comportamento ma non sono riuscito a trovarne.
Inoltre, le strutture sono tipi di valore (molto simili a int, char, ecc.) e quindi non sono annullabili.
Poiché una struttura è composta da probabilmente diversi tipi (non un tipo a valore singolo, ma un possibile composito di diversi tipi), per chiedere se è " Nothing " spezzerebbe la logica dell'uso di "Niente". Nulla viene testato in modo diverso a seconda del tipo che si sta testando e quindi un tipo complesso non aderisce alla logica dell'uso di "Niente". Tuttavia, per questo tipo di test, vale a dire, con una struttura che ha tutti i suoi componenti ai rispettivi "niente". valori, utilizziamo la funzione " IsNothing " ;. Ad esempio:
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