vb.net结构,什么都没有 - 问题
-
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文档中发现:
将其分配给变量的任何内容都将其设置为其声明类型的默认值。如果该类型包含变量成员,则它们都设置为默认值。
所以我发现当我分配时 没有 对于一个结构,其所有成员都设置为其默认值,而不是结构本身。
另外,我试图做 英石 通过宣布的无效类型:
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
笔记
我尚未测试上述代码,也无法访问我的代码图书馆。
灵感
看看微软的 Point
和 Color
结构,使用其已发布的源代码或使用 .NET反射器.
没有这样的概念,例如“没有为结构分配,也不分配给其成员”。
听起来很像您应该看的 无效的价值类型 和 Nullable(Of T)
- 如果您需要能够代表一个值类型的“真实”值,那就是 恰恰 它被发明的原因。
考虑 Byte
例如。一种 Byte
值可以具有256个值中的任何一个(0-255)。如果分配值 Nothing
, ,实际上将使它变为0。它不能使其“不在0-255范围内”,因为它将被存储 作为字节. 。我认为这有点不幸 做 让您使用 Nothing
在这里,实际上……因为从哲学上讲是一个“缺失”的价值,而价值0确实是非常不同的事情。
无论如何,无效的值类型包裹“正常”价值类型,并提供额外的布尔值来说明是否有 真的 是否存在有用的价值。