Arrays vb.net-ReDim PREVICE-检查条目是否有效
我有一个自定义类数组:Arrays vb.net-ReDim PREVICE-检查条目是否有效,arrays,vb.net,Arrays,Vb.net,我有一个自定义类数组: Public foldersList(1) As folderEntry Public lastFolderId As Integer = 0 我正在添加如下新条目: foldersList(lastFolderId) = New folderEntry(...) lastFolderId += 1 ReDim Preserve foldersList(lastFolderId + 1) Public foldersList As New Li
Public foldersList(1) As folderEntry
Public lastFolderId As Integer = 0
我正在添加如下新条目:
foldersList(lastFolderId) = New folderEntry(...)
lastFolderId += 1
ReDim Preserve foldersList(lastFolderId + 1)
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
它工作得很好,但是当涉及到在整个数组中循环时,我的程序在涉及到新重拨的索引时崩溃。如何检查循环中的当前条目是否无效,是否只是占位符?我知道我可以使用带递增变量的循环,但我正在尝试对每个使用
下面的If
语句不起作用并产生错误
For Each folder As folderEntry In foldersList
If Not folder = Nothing Then
错误:未为类型“myAppName.folderEntry”和“myAppName.folderEntry”定义运算符“=”
可选问题:存储自定义类的最有效方法是什么 如果要检查引用类型变量是否为Nothing
(null),则需要使用Is
或IsNot
运算符。例如:
For Each folder As folderEntry In foldersList
If folder IsNot Nothing Then
End If
Next
正如Matt Wilko在下面的评论中提到的,VB.NET技术上允许您使用test=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(...)
然而,这不仅比仅仅使用列表(folderEntry)
对象更难做到,而且效率也要低得多。每次调整数组大小时,它都必须创建一个全新的数组,然后将内容从旧数组复制到新数组,然后删除旧数组。那是很多不必要的工作。如果在开始之前知道需要的项目总数,只需在开始时创建大小正确的数组。如果不这样做,则最好使用列表(folderEntry)
对象,如下所示:
foldersList(lastFolderId) = New folderEntry(...)
lastFolderId += 1
ReDim Preserve foldersList(lastFolderId + 1)
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
我不确定错误消息和指示的行是否匹配,但几乎总是如果某个东西可能是空的,您不会使用=
来测试该项目/对象。如果文件夹不是空的,请尝试,然后。。。另外,一个列表
会比一个数组
工作得更好。如果文件夹不是空的,那么
…你应该使用一个列表(T)
而不是使用数组-它会让你的生活更轻松。@puropoix,我认为只有在Java中才能遇到这种问题。谢谢,现在可以用了。我也会考虑使用列表。再次感谢您的帮助!演示如何将列表(myClass)
与文件类型的东西一起使用-它们比数组更容易使用您的第一行对于引用类型是正确的,=任何内容都不能用于值类型(是否应该是一个有争议的问题)@MattWilko很好。我应该提到这一点。我再加上。谢谢