Lebensdauer von Klassen

16/01/2011 - 14:50 von Anonymous | Report spam
Dies ist eine mehrteilige Nachricht im MIME-Format.

=_NextPart_000_0023_01CBB58C.AEF01690

Hallo
ich habe folgenden Konstrukt, der auch funktioniert. Mich wundert aber, dass in frmMain.ButtonItem_Click NACH der “End Using” die Variable f.Testmember in der TestMemberSammler-Liste immer noch zur Verfà¼gung steht. Testmember wurde doch in der frmTest instanziert die ist aber inzwischen geschlossen (und somit disposed)? HeiàŸt dies dann auch, dass auch jedesmal eine Instanz der frmTest im Speicher gehalten wird, wenn man die TestKlasse innherhalb diese Hilfsformulars instanziert?


Public Class frmMain
Private Sub ButtonItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonItem.Click
Using f As New frmTest()
f.ShowDialog(Me)
If f.TestMember IsNot Nothing Then
TestMemberSammler.Add (f.TestMember)
End If
End Using
End Sub
End Class


Public Class frmTest
Private mTestMember As TestKlasse
Public ReadOnly Property TestMember () As TestKlasse
Get
Return mTestMember
End Get
End Property
End Class


Public Class TestKlasse
Public Merker As String=”Hallo”
End Class


GruàŸ Peter
=_NextPart_000_0023_01CBB58C.AEF01690

<HTML><HEAD></HEAD>
<BODY dir=ltr>
<DIV dir=ltr>
<DIV style="FONT-FAMILY: 'Verdana'; COLOR: #000000; FONT-SIZE: 10pt">
<DIV><FONT color=#000000>Hallo </FONT></DIV>
<DIV><FONT color=#000000>ich habe folgenden Konstrukt, der auch funktioniert.
Mich wundert aber, dass in frmMain.ButtonItem_Click NACH der “End Using” die
Variable f.Testmember in der TestMemberSammler-Liste immer noch zur Verfà¼gung
steht. Testmember wurde doch in der frmTest instanziert die ist aber inzwischen
geschlossen (und somit disposed)? HeiàŸt dies dann auch, dass auch jedesmal eine
Instanz der frmTest im Speicher gehalten wird, wenn man die TestKlasse
innherhalb diese Hilfsformulars instanziert?</FONT></DIV>
<DIV><FONT color=#000000></FONT>&nbsp;</DIV>
<DIV><FONT color=#000000></FONT>&nbsp;</DIV>
<DIV><FONT color=#000000>Public Class frmMain<BR>&nbsp;&nbsp;&nbsp; Private Sub
ButtonItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles ButtonItem.Click<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Using f
As New
frmTest()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
f.ShowDialog(Me)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
If f.TestMember IsNot Nothing
Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
TestMemberSammler.Add
(f.TestMember)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
End If<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End
Using<BR>&nbsp;&nbsp;&nbsp; End Sub<BR>End Class</FONT></DIV>
<DIV><FONT color=#000000></FONT>&nbsp;</DIV>
<DIV><FONT color=#000000></FONT>&nbsp;</DIV>
<DIV><FONT color=#000000>Public Class frmTest<BR>&nbsp;&nbsp;&nbsp; Private
mTestMember As TestKlasse<BR>&nbsp;&nbsp;&nbsp; Public ReadOnly Property
TestMember () As TestKlasse<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Get<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return
mTestMember <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End
Get<BR>&nbsp;&nbsp;&nbsp; End Property<BR>End Class</FONT></DIV>
<DIV><FONT color=#000000></FONT>&nbsp;</DIV>
<DIV><FONT color=#000000></FONT>&nbsp;</DIV>
<DIV><FONT color=#000000>Public Class TestKlasse<BR>&nbsp;&nbsp;&nbsp; Public
Merker As String=”Hallo”<BR>End Class</FONT></DIV>
<DIV><FONT color=#000000></FONT>&nbsp;</DIV>
<DIV><FONT color=#000000></FONT>&nbsp;</DIV>
<DIV><FONT color=#000000>GruàŸ Peter</FONT></DIV></DIV></DIV></BODY></HTML>

=_NextPart_000_0023_01CBB58C.AEF01690--
 

Lesen sie die antworten

#1 Armin Zingler
16/01/2011 - 17:35 | Warnen spam
Hallo Peter,

wàre klasse, wenn du das mit dem Zeilenumbruch bitte àndern könntest. Danke!

Am 16.01.2011 14:50, schrieb :
Hallo
ich habe folgenden Konstrukt, der auch funktioniert. Mich wundert aber, dass in
frmMain.ButtonItem_Click NACH der “End Using” die Variable f.Testmember in der
TestMemberSammler-Liste immer noch zur Verfügung steht. Testmember wurde doch in der frmTest
instanziert die ist aber inzwischen geschlossen (und somit disposed)? Heißt dies dann auch,
dass auch jedesmal eine Instanz der frmTest im Speicher gehalten wird, wenn man die TestKlasse
innherhalb diese Hilfsformulars instanziert?



Es ist richtig, dass das Objekt mit "End Using" disposed wird. Das heißt aber nicht, dass
dadurch alle Felder gelöscht werden. Das Objekt existiert weiterhin. Es kommt eben darauf an,
was beim Disposen durchgefüht wird. Da Testmember eine Eigenschaft ist, gibt es die
auch weiterhin, und auch der zurückgegebene Wert, der aus dem Feld "mTestMember" stammt,
ist immer noch der gleiche. Erst, wenn du beim Disposen der Form mTestMember auf Nothing
setzen würdest, würdest du das nach dem "End Using" auch merken.

Sozusagen: Ein "dispostes" Objekt unterscheidet sich von einem nicht-disposten nur durch
das, was beim Disposen gemacht wird. Ansonsten steckt da keine weitere Magie dahinter.

Public Class frmMain
Private Sub ButtonItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonItem.Click
Using f As New frmTest()
f.ShowDialog(Me)
If f.TestMember IsNot Nothing Then
TestMemberSammler.Add (f.TestMember)
End If
End Using
End Sub
End Class


Public Class frmTest
Private mTestMember As TestKlasse
Public ReadOnly Property TestMember () As TestKlasse
Get
Return mTestMember
End Get
End Property
End Class


Public Class TestKlasse
Public Merker As String=”Hallo”
End Class


Gruß Peter




Armin

Ähnliche fragen