Destruktor funktioniert nicht

01/03/2010 - 20:07 von Volker Alkemper | Report spam
Hallo liebe Helfer,
nach einigen Übungen in VBA wage ich mich jetzt nach VB2008. Mein Problem:
Ich möchte ein Objekt abspeichern, bevor es zerstört wird und dafür den
Destruktor verwenden. Leider wird dieser nicht aufgerufen. Meines Wissens
muss der aber automatisch aufgerufen werden, wenn ein Objekt zerstört wird.
Mein Code:

Public Class BasisKlasse
...
Public Sub Save()
...
End Sub
Protected Overrides Sub finalize()
MsgBox("Basis Destruktor: " & Me.Name)
Call Save()
End Sub
End Class

Public Class ChildKlasse
Inherits BasisKlasse
...
Sub New(ByVal Index As Integer)
...
End Sub

Protected Overrides Sub finalize()
MsgBox("Child Destruktor: " & Me.Name)
Call Save()
End Sub
End Class

Module Test
Private Testobjekt as Childklasse
Sub Main()
Testobjekt = New Childklasse(1)
Testobjekt = Nothing
Testobjekt = New Childklasse(2)
End Sub
End Module

Wenn ich das Modul Test laufen lasse, beendet das Programm, ohne einmal
irgendeine Msgbox zu öffnen bzw. die Save()-Routine auszuführen.
Habe ich etwas falsch verstanden? Wo ist mein Denkfehler? Benötigt finalize
irgendwelche Randbedingungen?

Liebe Grüße
Volker
 

Lesen sie die antworten

#1 Herfried K. Wagner [MVP]
01/03/2010 - 20:18 | Warnen spam
Hallo Volker!

Am 01.03.2010 20:07, schrieb Volker Alkemper:
nach einigen Übungen in VBA wage ich mich jetzt nach VB2008. Mein Problem:
Ich möchte ein Objekt abspeichern, bevor es zerstört wird und dafür den
Destruktor verwenden. Leider wird dieser nicht aufgerufen. Meines Wissens
muss der aber automatisch aufgerufen werden, wenn ein Objekt zerstört wird.
Mein Code:

Public Class BasisKlasse
...
Public Sub Save()
...
End Sub
Protected Overrides Sub finalize()
MsgBox("Basis Destruktor: "& Me.Name)
Call Save()
End Sub
End Class

Public Class ChildKlasse
Inherits BasisKlasse
...
Sub New(ByVal Index As Integer)
...
End Sub

Protected Overrides Sub finalize()
MsgBox("Child Destruktor: "& Me.Name)
Call Save()
End Sub
End Class

Module Test
Private Testobjekt as Childklasse
Sub Main()
Testobjekt = New Childklasse(1)
Testobjekt = Nothing



Damit wird lediglich ein Verweis entfernt. Der Garbage Collector von
.NET benutzt jedoch Ablaufverfolgung anstelle von Verweiszàhlung. D.h.,
auch wenn auf ein Objekt keine Verweise mehr bestehen, wird es nicht
notwendigerweise sofort zerstört. Lies dazu am Besten die Kapitel in der
Dokumentation zum Garbage Collector:

Garbage Collection
<URL:http://msdn.microsoft.com/en-us/lib...x.aspx>

Garbage Collector Basics and Performance Hints
<URL:http://msdn.microsoft.com/en-us/lib...7.aspx>

...

M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Ähnliche fragen