Share via


Gewusst wie: Konvertieren einer benutzerdefinierten Auflistung in eine typisierte Visual Basic-Auflistung

Aktualisiert: November 2007

In Visual Basic 6.0 beschränkt eine benutzerdefinierte Auflistung den Inhalt einer Auflistung auf eine bestimmte Klasse. Dies wird auch als typisierte Auflistung bezeichnet. Visual Basic 2008 stellt verschiedene Optionen zum Erstellen typisierter Klassen aus benutzerdefinierten Auflistungen von Visual Basic 6.0 bereit. Dieses Thema enthält drei Prozeduren, die jeweils eine andere Option veranschaulichen.

In diesem Thema wird davon ausgegangen, dass die benutzerdefinierte Auflistung aus Visual Basic 6.0 mit dem Klassengenerator-Dienstprogramm erstellt worden ist. Eine solche Auflistung verfügt über die folgenden Member:

  • Add   Fügt der Auflistung eine neue Instanz der benutzerdefinierten Klasse hinzu.

  • Item   Gibt auf der Grundlage eines Indexes der Auflistung eine Instanz der Auflistung zurück.

  • Count   Gibt die Anzahl der Instanzen in der Auflistung zurück.

  • Remove   Entfernt auf der Grundlage eines Indexes der Auflistung eine Instanz aus der Auflistung.

  • Enumeration   Unterstützt die Enumeration mit der For Each-Syntax.

So verwenden Sie den Aktualisierungs-Assistenten zum Erstellen einer Auflistung

  • Öffnen Sie das Visual Basic 6.0-Projekt in Visual Basic 2008. Nachfolgend wird der aktualisierte Code für eine Auflistungsklasse mit dem Namen Forest dargestellt, die Instanzen der Tree-Klasse enthält. Der Vorteil dieser Methode ist, dass keine Änderungen am Code erforderlich sind.

    ' For this example, the Tree class has no members.
    Option Strict Off
    Option Explicit On
    Friend Class Tree
    End Class
    
    Friend Class Forest
      Implements System.Collections.IEnumerable
      'local variable to hold collection
      Private mCol As Collection
    
      Public Function Add(Optional ByRef sKey As String = "") As Tree
        'create a new object
        Dim objNewMember As Tree
        objNewMember = New Tree
        'set the properties passed into the method
        If Len(sKey) = 0 Then
          mCol.Add(objNewMember)
        Else
          mCol.Add(objNewMember, sKey)
        End If
        'return the object created
        Add = objNewMember
        'UPGRADE_NOTE: Object objNewMember may not be destroyed until it is garbage collected. Click for more: 'ms-help://MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="vbup1029"'
    
        objNewMember = Nothing
      End Function
    
      Default Public ReadOnly Property Item(ByVal vntIndexKey _
        As Object) As Tree
        Get
          'used when referencing an element in the collection
          'vntIndexKey contains either the Index or Key to the collection,
          'this is why it is declared as a Variant
          'Syntax: Set foo = x.Item(xyz) or Set foo = x.Item(5)
          Item = mCol.Item(vntIndexKey)
        End Get
      End Property
    
      Public ReadOnly Property Count() As Integer
        Get
          'used when retrieving the number of elements in the
          'collection. Syntax: Debug.Print x.Count
          Count = mCol.Count()
        End Get
      End Property
    
      'UPGRADE_NOTE: NewEnum property was commented out. Click for more: 'ms-help://MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="vbup1054"'
    
      'Public ReadOnly Property NewEnum() As stdole.IUnknown
        'Get
          'this property allows you to enumerate
          'this collection with the For...Each syntax
          'NewEnum = mCol._NewEnum
        'End Get
      'End Property
    
      Public Function GetEnumerator() As System.Collections.IEnumerator _
        Implements System.Collections.IEnumerable.GetEnumerator
        'UPGRADE_TODO: Uncomment and change the following line to return the collection enumerator. Click for more: 'ms-help://MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="vbup1055"'
    
        'GetEnumerator = mCol.GetEnumerator
      End Function
    
      Public Sub Remove(ByRef vntIndexKey As Object)
        'used when removing an element from the collection
        'vntIndexKey contains either the Index or Key, which is why
        'it is declared as a Variant
        'Syntax: x.Remove(xyz)
        mCol.Remove(vntIndexKey)
      End Sub
    
      'UPGRADE_NOTE: Class_Initialize was upgraded to Class_Initialize_Renamed. Click for more: 'ms-help://MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="vbup1061"'
    
      Private Sub Class_Initialize_Renamed()
        'creates the collection when this class is created
        mCol = New Collection
      End Sub
      Public Sub New()
        MyBase.New()
        Class_Initialize_Renamed()
      End Sub
    
      'UPGRADE_NOTE: Class_Terminate was upgraded to Class_Terminate_Renamed. Click for more: 'ms-help://MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="vbup1061"'
    
      Private Sub Class_Terminate_Renamed()
        'destroys collection when this class is terminated
        'UPGRADE_NOTE: Object mCol may not be destroyed until it is garbage collected. Click for more: 'ms-help://MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="vbup1029"'
    
        mCol = Nothing
      End Sub
      Protected Overrides Sub Finalize()
        Class_Terminate_Renamed()
        MyBase.Finalize()
      End Sub
    End Class
    

.NET Framework und Visual Basic 2008 stellen mehrere generische Auflistungen bereit. Der Vorteil der Verwendung generischer Klassen besteht darin, dass sehr wenig Code zur Implementierung dieser Klassen erforderlich ist.

So erstellen Sie mit generischen Auflistungen eine Auflistung

  1. Erstellen Sie die Klassendefinition. Es folgt ein Beispiel für eine Tree-Klasse:

    Public Class Tree
        Public Species As String
    End Class
    
  2. Erstellen Sie eine generische Listenklasse aus .NET Framework. Diese Deklaration ersetzt im Grunde die gesamte Forest-Klasse aus der obigen Prozedur mit dem Namen "So verwenden Sie den Aktualisierungs-Assistenten zum Erstellen einer Auflistung".

    Dim forest As New System.Collections.Generic.List(Of Tree)
    
  3. Schreiben Sie Code, mit dem Sie auf das Listenobjekt zugreifen können. Im folgenden Code werden fünf Instanzen der Tree-Klasse der Auflistung hinzugefügt und anschließend ausgedruckt.

    For count As Integer = 1 To 5
        Dim sapling As New Tree
        sapling.Species = "oak"
        Forest.Add(sapling)
    Next
    
    For Each sapling As Tree In Forest
        MsgBox(sapling.Species)
    Next
    

.NET Framework umfasst die CollectionBase-Klasse. Typisierte Auflistungen werden erstellt, indem von CollectionBase geerbt wird. Bei Verwendung dieser Methode wird weniger Code als beim Einsatz des Aktualisierungs-Assistenten erstellt, aber mehr als bei Verwendung einer generischen Auflistung. Sie ist flexibler als die generische Lösung, da der Programmierer der Auflistungsklasse zusätzliche Member hinzufügen kann.

So erstellen Sie eine Auflistung mithilfe der CollectionBase-Klasse

  1. Erstellen Sie die Klassendefinition. Es folgt ein Beispiel für eine Tree-Klasse:

    Public Class Tree
        Public Species As String
    End Class
    
  2. Erstellen Sie eine Klasse, die von der CollectionBase-Klasse erbt. Fügen Sie mindestens eine Add-Methode und eine Item-Eigenschaft hinzu. Dadurch wird die Auflistungsklasse stark typisiert.

    Class TreeCollection
      Inherits System.Collections.CollectionBase
    
      Public Sub Add(ByVal value As Tree)
        Me.List.Add(value)
      End Sub
    
      Default Public Property Item(ByVal index As Integer) As Tree
          Get
              Return CType(Me.List(index), Tree)
          End Get
          Set(ByVal value As Tree)
              If index <= Me.Count - 1 Then
                  Me.List(index) = value
              Else
                  Throw New IndexOutOfRangeException()
              End If
          End Set
      End Property
    End Class
    
  3. Schreiben Sie Code, mit dem Sie auf das Listenobjekt zugreifen können. Im folgenden Code werden fünf Instanzen der Tree-Klasse der Auflistung hinzugefügt und anschließend ausgedruckt.

    Dim forest As New TreeCollection
    
    For count As Integer = 1 To 5
        Dim sapling As New Tree
        sapling.Species = "oak"
        Forest.Add(sapling)
    Next
    
    For Each sapling As Tree In Forest
        MsgBox(sapling.Species)
    Next
    

Siehe auch

Referenz

List

CollectionBase

IEnumerable