C # vs VB.NET - Handhabung von null Structures
Frage
ich auf diese lief und wundere mich, wenn jemand erklären könnte, warum dies in VB.NET funktioniert, wenn ich es nicht erwarten sollte, so wie es funktioniert 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
Aber dann in VB.NET ...
Structure Person
Public name As String
End Structure
...
Dim someone As Person = Nothing 'Wha? this is okay?
ist nichts nicht die gleiche wie null ( Nothing = null -? LOL)? , oder ist dies nur verschiedenen Möglichkeiten, die gleiche Situation zwischen den beiden Sprachen Handhabung
Warum oder was behandelt wird unterschiedlich zwischen den beiden, die in einem dieser Ordnung macht, aber nicht die anderen?
[Update]
einige der Kommentare Da ich mit diesem etwas verwirrt ... es scheint, als ob Sie tatsächlich Nullable verwenden, wenn Sie etwas zu sein, null in VB.NET zulassen wollen ... so zum Beispiel .. .
'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'
Zu seltsam ...
Lösung
Wenn ich mich richtig erinnere, ‚Nichts‘ in VB bedeutet „den Standardwert“. Für einen Werttyp, das ist der Standardwert für einen Referenz-Typen, das wäre null sein. So nichts auf eine Struktur zuordnen, ist kein Problem.
Andere Tipps
Nothing
entspricht in etwa für den jeweiligen Typ default(T)
. (Just überprüft, und das gilt für Streicher als auch - d. H Nothing
ist ein NULL-Verweis im Zusammenhang mit Strings)
Ich habe versucht, es auf MSDN zu suchen, konnte aber nichts relevant auf der VB Seite. Wenn für „Struktur“ auf C # sucht, gibt sie deutlich, dass es sich um einen Werttyp ist und nicht null zugeordnet werden kann, da ... es ist ein Wert.
Wenn jedoch auf VB.NET Stichwort „Struktur“ suchen sie sagt nicht, „Werttyp“. Stattdessen sagt sie
Die Struktur Anweisung definiert ein Composite-Werttyp, können Sie anpassen.
So ... Objekt?
Das wäre meine Vermutung. Ich möchte Verweise auf dieses Verhalten haben, konnte aber keine finden.
Auch structs sind Werttypen (ähnlich wie int, char, etc.) und sind somit nicht-Nullwerte enthalten.
Da eine Struktur aus möglicherweise mehr verschiedenen Typen gemacht (nicht einen einzigen Wert Typ, sondern eine möglichen Verbund aus mehreren verschiedenen Typen), zu fragen, ob es „nichts“ würde die Logik der Verwendung von „Nichts“ brechen . Nichts Tests unterschiedlich, je nach Typ, den Sie testen und daher ein komplexer Typ haftet nicht an die Logik der Verwendung von „Nothing“. Jedoch ist für diese Art von Tests, das heißt mit einer Struktur, alle seine Komponentenelemente an ihren jeweiligen „Nichts“ Werte haben, verwenden wir die Funktion „IsNothing“. Zum Beispiel:
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