我使用的是使用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文档中发现:

将其分配给变量的任何内容都将其设置为其声明类型的默认值。如果该类型包含变量成员,则它们都设置为默认值。

所以我发现当我分配时 没有 对于一个结构,其所有成员都设置为其默认值,而不是结构本身。

另外,我试图做 英石 通过宣布的无效类型:

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

但是,我仍然无法检查是否是否 英石 没有使用:

    If st Is Nothing Then  

或者

    If st.Equals(Nothing) Then

所以,问题:
1-可以分配 没有 到结构而不是对其成员?
2-如何检查返回结构值是否为 没有?

有帮助吗?

解决方案

结构是一种价值类型,它不可能是什么。无效的类型可以解决您的问题,在类型名称之后放置问号,以使其简短而活泼。这是一个例子:

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框架中经常使用。您使用的方法取决于您的要求。如果结构不经常测试,我将使用方法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 

测试为:

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:使用无效(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

笔记

我尚未测试上述代码,也无法访问我的代码图书馆。

灵感

看看微软的 PointColor 结构,使用其已发布的源代码或使用 .NET反射器.

没有这样的概念,例如“没有为结构分配,也不分配给其成员”。

听起来很像您应该看的 无效的价值类型Nullable(Of T) - 如果您需要能够代表一个值类型的“真实”值,那就是 恰恰 它被发明的原因。

考虑 Byte 例如。一种 Byte 值可以具有256个值中的任何一个(0-255)。如果分配值 Nothing, ,实际上将使它变为0。它不能使其“不在0-255范围内”,因为它将被存储 作为字节. 。我认为这有点不幸 让您使用 Nothing 在这里,实际上……因为从哲学上讲是一个“缺失”的价值,而价值0确实是非常不同的事情。

无论如何,无效的值类型包裹“正常”价值类型,并提供额外的布尔值来说明是否有 真的 是否存在有用的价值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top