Richtiges Löschen globaler Variablen in VB.NET
Hallo Forum,
ich habe ein Verständnisproblem, wie man Variablen richtig wieder löscht. Folgendes Beispiel.
Ich habe ein Programm, das aus 2 Klassen besteht, einer Hauptklasse und einer Unterklasse. In der Hauptklasse definiere ich eine globale Variable, die auf das Interface der Unterklasse verweist, so dass ich die Funktionen der Unterklasse dort nutzen kann. Wie kann ich aber bei Programmende diese Variablen wieder richtig löschen, damit der Speicher wieder freigegeben wird?
Kann mir bitte jemand ein kurzes Beispiel hierfür zeigen?
Vielen Dank,
M. Born
ich habe ein Verständnisproblem, wie man Variablen richtig wieder löscht. Folgendes Beispiel.
Ich habe ein Programm, das aus 2 Klassen besteht, einer Hauptklasse und einer Unterklasse. In der Hauptklasse definiere ich eine globale Variable, die auf das Interface der Unterklasse verweist, so dass ich die Funktionen der Unterklasse dort nutzen kann. Wie kann ich aber bei Programmende diese Variablen wieder richtig löschen, damit der Speicher wieder freigegeben wird?
Kann mir bitte jemand ein kurzes Beispiel hierfür zeigen?
Vielen Dank,
M. Born
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 360722
Url: https://administrator.de/contentid/360722
Ausgedruckt am: 21.11.2024 um 21:11 Uhr
10 Kommentare
Neuester Kommentar
Servus M.Born.
Da gibt's verschiedene Möglichkeiten, die gängigste ist die Nutzung des Using-Statements
Im Allgemeinen wird der Speicher einer Variablen aber automatisch wieder freigegeben wenn sei Out of Scope Ist und sie nicht mehr benötigt wird. Die Garbage Collection sorgt regelmäßig dafür.
Manuell können Objekte über ihre Dispose() Methode freigegeben werden sofern das Interface dafür implementiert ist, für das Using ist ebenfalls IDisposable zu implementieren.
Detailliertere Info dazu
https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/l ...
Grüße Uwe
Da gibt's verschiedene Möglichkeiten, die gängigste ist die Nutzung des Using-Statements
Using obj as new Subclass
' hier ist die Variable "obj" gültig
End Using
' ab hier existiert sie nicht mehr
Manuell können Objekte über ihre Dispose() Methode freigegeben werden sofern das Interface dafür implementiert ist, für das Using ist ebenfalls IDisposable zu implementieren.
Detailliertere Info dazu
https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/l ...
Grüße Uwe
Jene Klasse, deren Instanz Du mit "Using" eingrenzt, muss die Schnittstelle "IDisposable" implementieren.
füge einfach hinzu "Implements IDisposable" <Enter>
Nach dem Enter fügt er Dir am Ende der Klasse einen Block mit notwendigen Member hinzu.
Class Test1
End Class
füge einfach hinzu "Implements IDisposable" <Enter>
Nach dem Enter fügt er Dir am Ende der Klasse einen Block mit notwendigen Member hinzu.
Public Class Test1
Implements IDisposable
#Region "IDisposable Support"
Private disposedValue As Boolean ' So ermitteln Sie überflüssige Aufrufe
' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: Verwalteten Zustand löschen (verwaltete Objekte).
End If
' TODO: Nicht verwaltete Ressourcen (nicht verwaltete Objekte) freigeben und Finalize() unten überschreiben.
' TODO: Große Felder auf NULL festlegen.
End If
Me.disposedValue = True
End Sub
' TODO: Finalize() nur überschreiben, wenn Dispose(ByVal disposing As Boolean) oben über Code zum Freigeben von nicht verwalteten Ressourcen verfügt.
'Protected Overrides Sub Finalize()
' ' Ändern Sie diesen Code nicht. Fügen Sie oben in Dispose(ByVal disposing As Boolean) Bereinigungscode ein.
' Dispose(False)
' MyBase.Finalize()
'End Sub
' Dieser Code wird von Visual Basic hinzugefügt, um das Dispose-Muster richtig zu implementieren.
Public Sub Dispose() Implements IDisposable.Dispose
' Ändern Sie diesen Code nicht. Fügen Sie oben in Dispose(disposing As Boolean) Bereinigungscode ein.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
Wenn Du jetzt
anwendest, dann wir beim Verlassen des Using-Blocks für X (Instanz von Test1) automatisch die Methode "Dispose" ausgeführt.
Wenn Du jetzt in Klasse "Test1" z.B. eine List(of String) hast, dann kannst Du in der Methode "Dispose" diese Liste explizit leeren lassen.
(Zeile 4 - 10)
(Zeile 21)
Using X as Test1
....
End Using
anwendest, dann wir beim Verlassen des Using-Blocks für X (Instanz von Test1) automatisch die Methode "Dispose" ausgeführt.
Wenn Du jetzt in Klasse "Test1" z.B. eine List(of String) hast, dann kannst Du in der Methode "Dispose" diese Liste explizit leeren lassen.
(Zeile 4 - 10)
(Zeile 21)
Public Class Test1
Implements IDisposable
Private MyList as new List(of String)
Public Sub New()
For I as Integer = 1 to 1000
MyList.Add(I)
End
End Sub
#Region "IDisposable Support"
Private disposedValue As Boolean ' So ermitteln Sie überflüssige Aufrufe
' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: Verwalteten Zustand löschen (verwaltete Objekte).
MyList.Clear
End If
' TODO: Nicht verwaltete Ressourcen (nicht verwaltete Objekte) freigeben und Finalize() unten überschreiben.
' TODO: Große Felder auf NULL festlegen.
End If
Me.disposedValue = True
End Sub
' TODO: Finalize() nur überschreiben, wenn Dispose(ByVal disposing As Boolean) oben über Code zum Freigeben von nicht verwalteten Ressourcen verfügt.
'Protected Overrides Sub Finalize()
' ' Ändern Sie diesen Code nicht. Fügen Sie oben in Dispose(ByVal disposing As Boolean) Bereinigungscode ein.
' Dispose(False)
' MyBase.Finalize()
'End Sub
' Dieser Code wird von Visual Basic hinzugefügt, um das Dispose-Muster richtig zu implementieren.
Public Sub Dispose() Implements IDisposable.Dispose
' Ändern Sie diesen Code nicht. Fügen Sie oben in Dispose(disposing As Boolean) Bereinigungscode ein.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
Ich kann nicht ganz folgen, kenne Dein Klassen-Design nicht.
Im "IStatusfenster" muss der Member "Dispose" raus. Soviel ist klar.
Und die "ClsMboStatusfensterklasse" kann ja "IStatusfenster" implementieren.
(Überhaupt: "ClsMboStatusfensterklasse" vs. "....= New ClsStatusfensterklasse" --- Schreibfehler?)
Beim "Using" darfst Du aber nicht auf die Schnettstelle "IStatusfenster" einschränken, weil diese nicht "IDisposable" implementiert.
Wenn doch notwendig dann so
Im "IStatusfenster" muss der Member "Dispose" raus. Soviel ist klar.
Und die "ClsMboStatusfensterklasse" kann ja "IStatusfenster" implementieren.
(Überhaupt: "ClsMboStatusfensterklasse" vs. "....= New ClsStatusfensterklasse" --- Schreibfehler?)
Beim "Using" darfst Du aber nicht auf die Schnettstelle "IStatusfenster" einschränken, weil diese nicht "IDisposable" implementiert.
Wenn doch notwendig dann so
Using mStatusfenster As New ClsMboStatusfensterklasse
dim xStatusfenster as IStatusfenster = DirectCast(mStatusfenster,IStatusfenster)
.... mit xStatusfenster weiterarbeiten
xStatusfenster.Methode_XYZ_von_IStatusfenster()
... oder ....
With DirectCast(mStatusfenster,IStatusfenster)
.Methode_XYZ_von_IStatusfenster()
End With
End Using