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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top