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函数的结果时,我希望st是Nothing.但这不是发生的事情.
然后我在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)
AMi*_*ico 11
前两个方法在.NET Framework中经常使用.您使用的方法取决于您的要求.如果不经常测试结构,我将使用方法#3.对于频繁测试,如果方法#2不适合"空"测试,我将使用方法#1.例如,Point结构将空点定义为{x = 0,y = 0},我认为这是不正确的.因此,我会在我的点结构实现中使用第一种方法.
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)
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)
定义为:
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 Point和Color结构.