Я страдаю от некоторых головных болей с помощью Структур и функций, которые Ничего не возвращают в 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 - Как я могу проверить, является ли значение структуры возврата Ничем?
Структура - это тип значения, она не может быть Ничто. Тип Nullable может решить вашу проблему, поставьте вопросительный знак после имени типа, чтобы сделать его коротким и быстрым. Вот пример:
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}, что я не считаю правильным. Поэтому в своей реализации структуры точки я бы использовал первый метод.
Пустой
тест для сравнительного тестированияДобавьте общий Тест
, чтобы использовать его для сравнения пустых точек.
Structure Test
Public Shared Empty As Test = New Test
Dim field1 As String
End Structure
Тест как:
If st = Test.Empty Then
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
Определить как:
Dim st As Test? = Foo()
'--or--
Dim st As Nullable(Of Test) = Foo()
Проверить как:
If st Is Nothing Then
'--or--
If st.HasValue = False Then
Я не тестировал приведенный выше код и у меня нет доступа к моей библиотеке кода.
Посмотрите на структуры Point
и Color
от Microsoft, используя их опубликованный исходный код или .NET Reflector.
Не существует такой концепции, как присвоение «ничего структуре, а не ее членам».
Это очень похоже на то, что вы должны смотреть на типы значений, допускающие значение NULL и Nullable (Of T)
- если вам нужно иметь возможность представить отсутствие «реального» значения для типа значения, это именно причина его изобретения.
Рассмотрим Например, байт
. Значение Байт
может иметь любое из 256 значений (0–255). Если вы присвоите ему значение Ничего
, это сработает. фактически сделать его 0. Он не может сделать это «какое-то значение вне диапазона 0-255», так как оно будет сохранено как байт . Я считаю несколько прискорбным, что VB не позволяет вам использовать здесь Nothing
, на самом деле ... потому что с философской точки зрения «отсутствующее» значение и значение 0 - это действительно очень разные вещи.
В любом случае, типы значений, допускающие значение NULL, заключают в оболочку «нормальные» типы значений и предоставляют дополнительное логическое значение, чтобы указать, действительно ли присутствует полезное значение или нет.