我有一系列自定义类:
Public foldersList(1) As folderEntry
Public lastFolderId As Integer = 0
我添加了这样的新条目:
foldersList(lastFolderId) = New folderEntry(...)
lastFolderId += 1
ReDim Preserve foldersList(lastFolderId + 1)
它运行良好,但是当涉及到整个数组的循环时,我的程序在新的redimmed索引时崩溃了。如何检查循环中的当前条目是否无效且只是占位符?我知道我可以使用循环增量变量但我尝试使用For Each
来完成它。
关注If
语句不起作用并产生错误。
For Each folder As folderEntry In foldersList
If Not folder = Nothing Then
错误:运营商' ='未定义类型' myAppName.folderEntry'和' myAppName.folderEntry'。
可选问题:存储自定义类的最有效方法是什么?
答案 0 :(得分:3)
如果要检查引用类型变量是否为Is
(null),则需要使用IsNot
或Nothing
运算符。例如:
For Each folder As folderEntry In foldersList
If folder IsNot Nothing Then
End If
Next
正如Matt Wilko在下面的评论中提到的,VB.NET在技术上允许你使用测试= Nothing
,但它有不同的含义。而不是检查变量是否为null,等于运算符将Nothing
转换为变量类型的默认值,然后将其与变量的值进行比较。这可能会导致意外行为,因此作为一般规则,我建议不要使用= Nothing
,除非您真的不知道特定类型的默认值是什么。例如,这是一个示例,显示= Nothing
的工作方式与您预期的不同。
Dim x As String = ""
If x = Nothing Then
' This code will be executed because "" = CStr(Nothing)
End If
If x Is Nothing Then
' This code will not be executed because x points to an empty string, but it is not null
End If
但是,如果您只是切换订单以便在添加新项目之前调整数组而不是之后,则不会出现问题:
Public foldersList() As folderEntry
Public lastFolderId As Integer = -1
' ...
lastFolderId += 1
ReDim Preserve foldersList(lastFolderId)
foldersList(lastFolderId) = New folderEntry(...)
然而,这不仅比使用List(Of folderEntry)
对象更难做,而且效率也差得多。每次调整数组大小时,都必须创建一个全新的数组,然后将旧数组中的内容复制到新数组,然后删除旧数组。这是很多不必要的工作。如果您在开始之前知道了所需的项目总数,只需在开头创建具有正确大小的数组。如果你不这样做,你会更好地使用List(Of folderEntry)
对象,如下所示:
Public foldersList As New List(Of folderEntry)()
' ...
foldersList.Add(New folderEntry(...))
' ...
For Each folder As folderEntry In foldersList
' No need to check if folder is Nothing
Next