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很好。我应该提到这一点。我再加上。谢谢