Pregunta

Estoy teniendo algunos dolores de cabeza utilizando Estructuras y funciones que nada de retorno en VB.NET.

Voy a tratar de explicar aquí con este código:

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

En el código anterior, cuando regrese Nada como resultado de la función Foo yo esperaría que st es Nada . Pero esto no es lo que sucede.

Entonces me encontré en la documentación de MSDN:

  

Asignación de nada a una variable establece que el valor predeterminado para su tipo declarado. Si ese tipo contiene miembros variables, que son todo listo para sus valores por defecto.

Así que descubrió que cuando le asigno Nada a una estructura, todos sus miembros se establecen en sus valores por defecto, en lugar de la estructura en sí.

Además, he intentado hacer st un tipo anulable declarando:

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

Pero, aún así no puedo comprobar si st es nada mediante el uso de:

    If st Is Nothing Then  

o

    If st.Equals(Nothing) Then

Por lo tanto, las preguntas:
1 - ¿Es posible asignar Nada a la estructura y no a sus miembros
2 - ¿Cómo puedo comprobar si un valor de retorno es struct Nada

¿Fue útil?

Solución

Una estructura es un tipo de valor, no puede haber nada. El tipo anulable puede resolver su problema, poner un signo de interrogación después de que el nombre del tipo que sea corta y ágil. He aquí un ejemplo:

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

Otros consejos

Los dos primeros métodos siguientes se utilizan con frecuencia en el .NET Framework. El método que utilice dependerá de sus necesidades. Voy a utilizar Método # 3 si la estructura a prueba con poca frecuencia. Para las pruebas frecuentes, voy a utilizar el método # 1 si Método # 2 no es apropiado para "vaciar" la prueba. Por ejemplo, la estructura Point define un punto vacío como {x = 0, y = 0}, que no creo que es correcta. Por lo tanto, me gustaría utilizar el primer método en mi aplicación estructura de puntos.

Método 1: Definir Prueba Empty para prueba de comparación

Añadir Test compartida a utilizar para un vacías comparación.

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

Prueba como:

If st = Test.Empty Then

Método 2: Definir IsEmpty Propiedad para la prueba

Definir una propiedad IsEmpty basado en el estado interno de la estructura.

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

Prueba como:

If st.IsEmpty Then

Método 3: Uso Anulable (Of T)

Definir como:

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

Prueba como:

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

Nota

No he probado el código anterior y no tengo acceso a mi biblioteca de códigos.

Inspiración

Tome un vistazo a las estructuras Point y Color de Microsoft, utilizando su código fuente publicada o el uso de .NET Reflector .

No hay ningún concepto como la asignación de "No hay nada a la estructura y no a sus miembros".

Se parece mucho a usted debe buscar en anulable tipos de valor y Nullable(Of T) - si tiene que ser capaz de representar la ausencia de un valor "real" para un tipo de valor, que de precisamente la razón por la que fue inventado.

Considere Byte por ejemplo. Un valor Byte puede tener cualquiera de los 256 valores (0-255). Si lo ha asignado el valor Nothing, que realmente hará que sea 0. No puede hacer que sea "un cierto valor no en el rango 0-255", ya que va a ser almacenado como un byte . Considero que es algo desafortunado que VB no le permiten usar Nothing aquí, en realidad ... porque filosóficamente una "falta" valor y el valor 0 son muy diferentes cosas a la verdad.

En cualquier caso, los tipos de valor anulables envolver tipos de valores "normales" y proporcionar un valor booleano extra para decir si hay realmente un valor de utilidad presente o no.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top