VB.NET结构和没什么 - 问题

RHa*_*uda 6 .net vb.net structure nothing data-structures

我在使用结构和函数时遇到了一些麻烦,这些函数在VB.NET中返回Nothing.

让我试着用这段代码解释一下:

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
Run Code Online (Sandbox Code Playgroud)

在前面的代码中,当我返回Nothing作为Foo函数的结果时,我希望stNothing.但这不是发生的事情.

然后我在MSDN文档中找到:

为变量赋值Nothing将其设置为其声明类型的默认值.如果该类型包含变量成员,则它们都设置为其默认值.

所以我发现当我为结构分配Nothing时,它的所有成员都被设置为默认值,而不是结构本身.

另外,我试图通过声明:使st成为Nullable类型:

    Dim st As Nullable(Of Test) = Foo()  
Run Code Online (Sandbox Code Playgroud)

但是,我仍然无法使用以下方法检查st是否为Nothing:

    If st Is Nothing Then  
Run Code Online (Sandbox Code Playgroud)

要么

    If st.Equals(Nothing) Then
Run Code Online (Sandbox Code Playgroud)

那么,问题:
1 - 是否可以为结构而不是其成员分配Nothing
2 - 如何检查返回结构值是否为Nothing

Han*_*ant 18

结构是值类型,它不能是Nothing.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
Run Code Online (Sandbox Code Playgroud)

  • 这 ?是 `Nullable(Of Test)` 的捷径。 (2认同)

AMi*_*ico 11

前两个方法在.NET Framework中经常使用.您使用的方法取决于您的要求.如果不经常测试结构,我将使用方法#3.对于频繁测试,如果方法#2不适合"空"测试,我将使用方法#1.例如,Point结构将空点定义为{x = 0,y = 0},我认为这是不正确的.因此,我会在我的点结构实现中使用第一种方法.

方法1:定义Empty比较测试的测试

添加共享Test以用于空比较.

Structure Test
    Public Shared Empty As Test = New Test
    Dim field1 As String 
End Structure 
Run Code Online (Sandbox Code Playgroud)

测试为:

If st = Test.Empty Then
Run Code Online (Sandbox Code Playgroud)

方法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 
Run Code Online (Sandbox Code Playgroud)

测试为:

If st.IsEmpty Then
Run Code Online (Sandbox Code Playgroud)

方法3:使用Nullable(Of T)

定义为:

Dim st As Test? = Foo() 
'--or--
Dim st As Nullable(Of Test) = Foo()
Run Code Online (Sandbox Code Playgroud)

测试为:

If st Is Nothing Then
'--or--
If st.HasValue = False Then
Run Code Online (Sandbox Code Playgroud)

注意

我没有测试上面的代码,我没有访问我的代码库.

灵感

使用他们发布的源代码或使用.NET Reflector来了解Microsoft PointColor结构.