Domanda

sto avendo qualche mal di testa utilizzando strutture e funzioni che restituiscono Niente in VB.NET.

Vorrei cercare di spiegare qui con questo codice:

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

Nel codice precedente, quando torno Nulla come risultato della funzione Foo mi aspetto che st è Niente . Ma questo non è ciò che accade.

Poi ho trovato nella documentazione MSDN:

  

L'assegnazione Niente da un set di variabili al valore di default per il suo tipo dichiarato. Se questo tipo contiene membri variabili, sono tutti insieme ai loro valori di default.

Così ho scoperto che quando ho assegnare Niente per una struttura, tutti i suoi membri sono impostati ai valori predefiniti, al posto del struct stesso.

Inoltre, ho provato a fare st un tipo Nullable dichiarando:

    Dim st As Nullable(Of Test) = Foo()  

, ma, ancora non posso controllare se st è Niente utilizzando:

    If st Is Nothing Then  

o

    If st.Equals(Nothing) Then

Quindi, domande:
1 - E 'possibile assegnare Niente per la struttura e non ai suoi membri
2 -? Come posso verificare se un valore di ritorno struct è Niente

È stato utile?

Soluzione

Una struttura è un tipo di valore, non può essere nulla. Il tipo Nullable può risolvere il problema, mettere un punto interrogativo dopo il nome del tipo per farla breve e scattanti. Ecco un esempio:

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

Altri suggerimenti

I primi due metodi seguenti sono usati frequentemente in .NET Framework. Il metodo utilizzato dipenderà vostre esigenze. Userò Metodo 3 # se la struttura testata di rado. Per il test frequenti, userò Metodo # 1 se Metodo # 2 non è appropriato per "svuotare" testing. Ad esempio, la struttura Point definisce un punto vuoto come {x = 0, y = 0}, che non credo sia corretto. Pertanto, vorrei utilizzare il primo metodo nella mia implementazione struttura punto.

Metodo 1: Definire prova Empty per il confronto test

Aggiungi Test condiviso da utilizzare per un vuoto-confronto.

Structure Test
    Public Shared Empty As Test = New Test
    Dim field1 As String 
End Structure 

Prova come:

If st = Test.Empty Then

Metodo 2: definire IsEmpty proprietà per il test

Definisci una proprietà IsEmpty sulla base di stato interno della struttura.

Structure Test 
    Public ReadOnly Property IsEmpty As Boolean
        Get
            Return Len(field1) = 0
        End Get
    End Property
    Dim field1 As String 
End Structure 

Prova come:

If st.IsEmpty Then

Metodo 3: Utilizzare Nullable (Of T)

Definisci come:

Dim st As Test? = Foo() 
'--or--
Dim st As Nullable(Of Test) = Foo()

Prova come:

If st Is Nothing Then
'--or--
If st.HasValue = False Then

Nota

Non ho ancora testato il codice di cui sopra e non ho accesso alla mia libreria dei codici.

Inspiration

Date un'occhiata a strutture Point e Color di Microsoft, utilizzando il loro codice sorgente pubblicato o utilizzando .NET Reflector .

Non c'è nessuna tale concetto come l'assegnazione di "Niente alla struttura e non ai suoi membri".

E 'suona molto come si dovrebbe essere guardando annullabile tipi di valore e Nullable(Of T) - se avete bisogno di essere in grado di rappresentare la l'assenza di un valore "reale" per un tipo di valore, che di esattamente il motivo è stato inventato.

Si consideri Byte per esempio. Un valore Byte può avere uno dei 256 valori (0-255). Se si assegna il valore di Nothing, che sarà effettivamente rendere 0. Non può rendere "un certo valore non nel range 0-255", come sta andando per essere memorizzati come un byte . Lo considero un po 'un peccato che VB non consente di utilizzare Nothing qui, in realtà ... perché filosoficamente un valore "mancante" e il valore 0 sono cose molto diverse in effetti.

In ogni caso, i tipi di valore nullable avvolgere "normali" i tipi di valore e di fornire un valore aggiunto booleano di dire se c'è davvero di un valore utile presente o meno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top