2

我正在使用旧的 Web 应用程序(vb.net 2003),并且正在尝试使用自定义类的通用列表。

我意识到 System.Collections.Generic 是根据链接在.Net 2中引入的

有没有其他选择?例如一个类数组?

假设我有以下类定义:

Public Class Box
  Public x As Integer
  Public y As Integer
End Class

和一个类框数组:

Dim BoxList() As Box
BoxList(0).x = 1
BoxList(0).y = 1

BoxList(1).x = 2
BoxList(2).y = 2

但是当错误时我得到一个BoxList(0).x = 1错误:Object reference not set to an instance of an object

我只是在这里猜测。

4

2 回答 2

4

使用ArrayList,像这样:

Dim BoxList As New ArrayList
Dim box = New Box()
box.x = 1
box.y = 2
BoxList.Add(box)

注意:建议您向将接受和值的Box类添加一个构造函数,如下所示:xy

Public Class Box
    Public x As Integer
    Public y As Integer

    Public Sub New(ByVal _x As Integer, ByVal _y As Integer)
        x = _x
        y = _y
    End Sub
End Class

现在您可以将ArrayList代码缩短为:

Dim BoxList As New ArrayList
BoxList.Add(New Box(1, 2))

要使用 中的值,ArrayList您需要将 中的值拆箱(不是双关语)ArrayList,如下所示:

For Each box In BoxList
    ' Use x value, like this
    CType(box, Box).x
Next

或(正如 Meta-Knight 建议的那样)

For Each box As Box In BoxList
    ' Now box is typed as Box and not object, so just use it
    box.x
Next
于 2013-08-22T14:35:28.150 回答
1

您可以创建自己的自定义集合类 - 这是我们在泛型之前必须做的事情。MSDN 的这篇文章为您提供了详细信息:

''' Code copied directly from article
Public Class WidgetCollection
   Inherits System.Collections.CollectionBase

    Public Sub Add(ByVal awidget As Widget)
       List.Add(aWidget)
    End Sub
    Public Sub Remove(ByVal index as Integer)
       If index > Count - 1 Or index < 0 Then
          System.Windows.Forms.MessageBox.Show("Index not valid!")
       Else
          List.RemoveAt(index)
       End If
    End Sub
    Public ReadOnly Property Item(ByVal index as Integer) As Widget
       Get
          Return CType(List.Item(index), Widget)
       End Get
    End Property

End Class
于 2013-08-22T14:44:10.317 回答