Vb.net strends и ничего - проблемы
-
02-10-2019 - |
Вопрос
У меня есть некоторые головные боли, используя структуры и функции, которые ничего не возвращают в 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 действительно очень разные вещи.
В любом случае, нулевые типы значений завернут «нормальные» типы значений и обеспечивают дополнительное логическое значение, чтобы сказать, есть ли В самом деле полезное значение присутствует или нет.