vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Wie kann ich die Anzahl der Instanzen einer Klasse erfassen? 
Autor: MikeJ
Datum: 25.11.11 14:18

Hallo zusammen,

ich möchte gerne wissen, wie viele Instanzen einer bestimmten Klasse aktuell vorhanden sind.
Dazu hatte ich mir einfach eine Shared-Variable erzeugt, und diese im Konstruktor erhöht, und im Destruktor erniedrigt.
Leider habe ich dann feststellen müssen, dass das nur die Halbe Wahrheit ist:

Hier die Test-Klasse
 
Public Class testClass
    Implements IDisposable
 
    Public Shared instanceList As New List(Of testClass)
    Private _name As String
 
    Public Sub New(ByVal Name As String)
        instanceList.Add(Me)
        _name = Name
    End Sub
 
 
#Region "IDisposable Support"
    Private disposedValue As Boolean ' So ermitteln Sie überflüssige Aufrufe
 
    ' IDisposable
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        Debug.WriteLine("Protected Dispose von " & _name)
        If Not Me.disposedValue Then
            If disposing Then
                instanceList.Remove(Me)
            End If
        End If
        Me.disposedValue = True
    End Sub
 
 
    ' Dieser Code wird von Visual Basic hinzugefügt, um das Dispose-Muster 
    ' richtig zu implementieren.
    Public Sub Dispose() Implements IDisposable.Dispose
        Debug.WriteLine("Public Dispose von " & _name)
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region
 
    Protected Overrides Sub Finalize()
        Debug.WriteLine("Finalize von " & _name)
        instanceList.Remove(Me)
        MyBase.Finalize()
    End Sub
End Class
Und hier der eigentliche Versuch:
 
Module Module1
 
    Sub Main()
        Console.ReadLine()
 
        Dim v1 As New testClass("v1")
        Debug.WriteLine("Instanzen: " & testClass.instanceList.Count)
        Console.ReadLine()
 
        Dim v2 As New testClass("v2")
        Debug.WriteLine("Instanzen: " & testClass.instanceList.Count)
        Console.ReadLine()
 
        v1 = New testClass("v1 Neu")
        Debug.WriteLine("Instanzen: " & testClass.instanceList.Count)
        Console.ReadLine()
 
        GC.Collect()
        GC.WaitForPendingFinalizers()
        Debug.WriteLine("Instanzen: " & testClass.instanceList.Count)
        Console.ReadLine()
 
        v1.Dispose()
        v2.Dispose()
        Debug.WriteLine("Instanzen: " & testClass.instanceList.Count)
        Console.ReadLine()
 
        GC.Collect()
        GC.WaitForPendingFinalizers()
        Debug.WriteLine("Instanzen: " & testClass.instanceList.Count)
        Console.ReadLine()
 
    End Sub
 
End Module
nun ist es so, dass beim neu beschreiben der Variable v1 die "alte" v1-Variable nicht automatisch zerstört wird, d.h. der Instanz-Zähler zeigt 3 Instanzen an. Nach dem Dispose von v1 und v2 zeigt er immer noch eine Instanz an.

Ist nun der Instanz-Zähler falsch, oder sind wirklich 3, bzw. eine Instanz nach dispose vorhanden?

Viele Grüße
Mike
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Wie kann ich die Anzahl der Instanzen einer Klasse erfassen?2.099MikeJ25.11.11 14:18
Re: Wie kann ich die Anzahl der Instanzen eine Klasse erfass...1.117ModeratorDaveS25.11.11 14:57
Re: Wie kann ich die Anzahl der Instanzen eine Klasse erfass...988MikeJ25.11.11 16:26
Re: Wie kann ich die Anzahl der Instanzen eine Klasse erfass...1.174ModeratorDaveS25.11.11 20:17

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel