Вопрос

У меня есть некоторые головные боли, используя структуры и функции, которые ничего не возвращают в VB.NET.

Позвольте мне попытаться объяснить здесь с этим кодом:

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

В предыдущем коде, когда я ничего не возвращаю в результате функции FOO, я бы ожидал, что ул является Ничего. Отказ Но это не то, что происходит.

Затем я нашел в документации MSDN:

Назначение ничего для переменной, устанавливает его значение по умолчанию для его объявленного типа. Если этот тип содержит вариабельные элементы, все они установлены на их значения по умолчанию.

Поэтому я обнаружил, что когда я назначу Ничего К структуре все его члены установлены на их значения по умолчанию, а не в самой структуре.

Кроме того, я пытался сделать ул Nullable тип, объявляющий:

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

Но все же я не могу проверить, ул Ничего, используя:

    If st Is Nothing Then  

или

    If st.Equals(Nothing) Then

Итак, вопросы:
1 - можно назначить Ничего к структуре, а не к своим членам?
2 - Как я могу проверить, является ли значение return Strack Ничего?

Это было полезно?

Решение

Структура - это тип значения, это не может быть ничего. Nullable Type может решить вашу проблему, поставить знак вопроса после имени типа, чтобы сделать его коротким и огромным. Вот пример:

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

Другие советы

Первые два следующих метода часто используются в .NET Framework. Используемый вами метод будет зависеть от ваших требований. Я буду использовать метод № 3, если структура проверена нечасто. Для частого тестирования я буду использовать метод № 1, если метод № 2 не подходит для «пустого» тестирования. Например, Point Структура определяет пустую точку как {x = 0, y = 0}, которые я не думаю, правильно. Следовательно, я бы использовал первый метод в реализации моей точки зрения.

Метод 1: определить Empty Тест на тестирование сравнения

Добавить поделиться Test использовать для пустого сравнения.

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

Тест как:

If st = Test.Empty Then

Метод 2: определить IsEmpty Недвижимость для тестирования

Определить ан IsEmpty собственность на основе внутреннего состояния структуры.

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

Тест как:

If st.IsEmpty Then

Способ 3: Используйте Nullable (из т)

Определите как:

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

Тест как:

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

Примечание

Я не проверил вышеуказанный код, и у меня нет доступа к моей библиотеке кодовой библиотеки.

Вдохновение

Посмотрите на Microsoft's Point а также Color структуры, используя их опубликованный исходный код или использование .Net отражатель.

Такая концепция не будет назначена «ничего для структуры, а не к своим членам».

Звучит очень похоже, вы должны смотреть на Nullbable Типы значений а также Nullable(Of T) - Если вам нужно иметь возможность представить отсутствие «реального» значения для типа значения, это точно Причина, по которой она была изобретена.

Рассмотреть возможность Byte Например. А. Byte Значение может иметь любой из 256 значений (0-255). Если вы назначаете его значение Nothing, что на самом деле сделает это 0. Он не может сделать это «некоторое значение не в диапазоне 0-255», так как он будет храниться как байт. Отказ Я считаю его несколько неудачным, что VB делает Позвольте вам использовать Nothing Здесь на самом деле ... потому что философски «отсутствующая» значение и значение 0 действительно очень разные вещи.

В любом случае, нулевые типы значений завернут «нормальные» типы значений и обеспечивают дополнительное логическое значение, чтобы сказать, есть ли В самом деле полезное значение присутствует или нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top