VB.NET Structs und Nichts - Probleme
-
02-10-2019 - |
Frage
Ich habe einige Kopfschmerzen mit den Strukturen und Funktionen, die Rückkehr Nothing in VB.NET verwendet wird.
Lassen Sie mich versuchen, hier mit diesem Code zu erklären:
Public Class Form1
Structure Test
Dim field1 As String
End Structure
Private Function Foo() As Test
Return Nothing
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim st As Test = Foo()
End Sub
End Class
Im vorherigen Code, wenn ich nichts als Ergebnis der Foo-Funktion zurückgeben würde ich erwarten, dass st ist Nichts . Aber das ist nicht, was passiert.
Dann fand ich in MSDN-Dokumentation:
Zuweisen von nichts zu einem variablen Sätzen es auf den Standardwert für seinen deklarierten Typen. Wenn dieser Typ variable Elemente enthält, sind sie alle auf ihre Standardwerte zurück.
Also habe ich entdeckt, dass, wenn ich assign Nichts auf eine Struktur, alle seine Mitglieder auf die Standardwerte eingestellt sind, anstelle der Struktur selbst.
Auch ich versuchte machen st eine Nullable Art, indem er erklärt:
Dim st As Nullable(Of Test) = Foo()
, aber noch kann ich nicht, wenn st ist nichts durch die Verwendung:
If st Is Nothing Then
oder
If st.Equals(Nothing) Then
Also, Fragen:
1 - Ist es möglich, Nichts , um die Struktur zuzuordnen und nicht an ihre Mitglieder
2 - Wie kann ich überprüfen, ob eine Rückkehr struct Wert Nichts
Lösung
Eine Struktur, ein Werttyp ist, kann es nicht Nichts sein. Der Nullable-Typ kann Ihr Problem, setzen Sie ein Fragezeichen nach dem Typnamen lösen, um es kurz und bissig zu machen. Hier ein Beispiel:
Module Module1
Structure Test
Dim field1 As String
End Structure
Private Function Foo() As Test?
Return Nothing
End Function
Sub Main()
Dim st As Test? = Foo()
Debug.Assert(st is Nothing)
End Sub
End Module
Andere Tipps
Die ersten beiden folgenden Methoden werden häufig in .NET Framework verwendet. Die verwendete Methode wird von Ihren Anforderungen abhängen. Ich verwende Methode # 3, wenn die Struktur selten getestet. Für häufige Tests, wird I Methode 1 Methode verwenden, wenn # 2 ist für nicht angemessen „leer“ zu testen. Zum Beispiel definiert die Point
Struktur einen leeren Punkt als {x = 0, y = 0}, die ich glaube nicht korrekt ist. Deshalb würde ich die erste Methode in meiner Punktstruktur Implementierung verwenden.
Methode 1: Definieren Sie Empty
Test für Vergleichstest
In gemeinsamen Test
für einen leeren Vergleich zu verwenden.
Structure Test
Public Shared Empty As Test = New Test
Dim field1 As String
End Structure
Test wie:
If st = Test.Empty Then
Methode 2: Definition IsEmpty
Property for Testing
Definieren Sie eine IsEmpty
Eigenschaft basieren auf internen Zustand der Struktur.
Structure Test
Public ReadOnly Property IsEmpty As Boolean
Get
Return Len(field1) = 0
End Get
End Property
Dim field1 As String
End Structure
Test wie:
If st.IsEmpty Then
Methode 3: Verwenden Nullable (Of T)
definieren als:
Dim st As Test? = Foo()
'--or--
Dim st As Nullable(Of Test) = Foo()
Test wie:
If st Is Nothing Then
'--or--
If st.HasValue = False Then
Hinweis
Ich habe den obigen Code nicht getestet, und ich habe keinen Zugriff auf meine Code-Bibliothek.
Inspiration
Werfen Sie einen Blick auf Microsofts Point
und Color
Strukturen, deren veröffentlichten Quellcode verwenden oder mit .NET Reflector .
Es gibt kein Konzept wie „Nichts auf die Struktur und nicht an ihre Mitglieder“ zugewiesen wird.
Es klingt sehr ähnlich wie Sie unter NULL festlegbare Werttypen suchen sollte und Nullable(Of T)
- wenn Sie das darstellen können, Fehlen eines „echten“ Wert für einen Werttyp, dass die genau der Grund, es erfunden wurde.
Betrachten Byte
zum Beispiel. Ein Byte
Wert können beliebige Werte haben 256 (0-255). Wenn Sie den Wert Nothing
zuweisen, das wird es tatsächlich machen 0. Es nicht machen kann „einen gewissen Wert nicht im Bereich von 0-255“, wie es wird gespeichert werden als Byte . Ich betrachte es als etwas unglücklich, dass VB nicht können Sie Nothing
verwenden hier, eigentlich ... weil philosophisch ein „fehlenden“ Wert und dem Wert 0 sind sehr verschiedene Dinge in der Tat.
Wie auch immer, wickeln Nullable-Wertetypen „normalen“ Werttypen und bieten einen zusätzlichen Booleschen Wert zu sagen, ob es wirklich ein nützlicher Wert vorhanden ist oder nicht.