Структуры VB.NET и Ничто - проблемы

Я страдаю от некоторых головных болей с помощью Структур и функций, которые Ничего не возвращают в 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 - Как я могу проверить, является ли значение структуры возврата Ничем?

6
задан AMissico 2 July 2010 в 21:19
поделиться

3 ответа

Структура - это тип значения, она не может быть Ничто. Тип 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
18
ответ дан 8 December 2019 в 03:26
поделиться

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

Метод 1: Определите Пустой тест для сравнительного тестирования

Добавьте общий Тест, чтобы использовать его для сравнения пустых точек.

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(Of T)

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

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.

11
ответ дан 8 December 2019 в 03:26
поделиться

Не существует такой концепции, как присвоение «ничего структуре, а не ее членам».

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

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

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

0
ответ дан 8 December 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: