VB.NET Strutture ed Niente - problemi
-
02-10-2019 - |
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
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 ??h3>
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.