vb.net - ReDim Preserve - 检查条目是否有效

时间:2014-06-13 11:52:15

标签: arrays vb.net

我有一系列自定义类:

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'。

可选问题:存储自定义类的最有效方法是什么?

1 个答案:

答案 0 :(得分:3)

如果要检查引用类型变量是否为Is(null),则需要使用IsNotNothing运算符。例如:

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