Verstaendnisfrage SHARED VB9

Hallo,

ich bin gerade dabei und stehe irgendwie auf derLeitung :s

Wenn ich eine Klasse habe, mit folgenden Inhalt

Public Class Class1

 Private Shared tabell(1, 1) As String
 Public Shared myvar As Integer

 Shared Sub New()
 tabell(0, 0) = "I" : tabell(0, 1) = "1"
 tabell(1, 0) = "V" : tabell(1, 1) = "5"
 End Sub

 Sub New(ByVal var As Integer)
 myvar = var
 End Sub

 Sub New(ByVal var As String)
 myvar = 0
 End Sub

 Public Function getTabelle(ByVal index As Integer) As String
 Return tabell(index, 0)
 End Function

End Class

und nun aus der Form heraus folgendenden Source ausführe

 Dim loc As New Class1(1)
 Dim loc1 As New Class1("1")

sehe ich es richtig, das erst die Klasse initialisiert wird. Dabei wird die Shared Sub New aufgerufen und dort die tabell gefuellt.
Danach springt er in die sub Sub New ((ByVal var As Integer) und führt dort den Source aus. Die Daten in tabell bleiben erhalten.
Danach springt er zum Progg zurueck und bei der naechsten Initialisierung der Klasse , springt er dann gleich zur Sub New (ByVal var As String) und führt dort den source aus. Die Sub Shared Sub New wird nicht ausgefuehrt da sie schon einmal aufgerufen wurde!

Sehe ich das richtig?

Wenn nein, wo liegt denn mein Denkfehler?
Wenn ja, warum sehe ich beim debuggen nicht die einmalige Auführung der shared sub New ?

Wenn ich eine Klasse entlade ( noch weiss ich nicht wie :s) und ich initialisiere sie dann neu. Wird dann die shared Sub New erneut aufgerufen ?

MfG Alex

Hallo!

Der Ablauf ist genau so, wie Du’s geschildert hast: Wenn das Programm das erste Mal mit Deiner Klasse „Class1“ zu tun bekommt (im konkreten Fall: Weil Du eine Objekt diesen Typs erstellst), dann wird der Typinitialisierer (die Shared Sub New in VB.NET) durchlaufen. Anschließend dann der passende Konstruktor (die Sub New ).

Ich hab’s interessehalber mal nachgestellt (mit VS2005) und das Debugverhalten ist erwartungsgemäß. Kann es sein, dass Dir irgendwo eines dieser unsäglichen DebuggerStepThrough-Attribute ein Bein stellt? Das baut der Designer bei VB-Projekten an manchen Stellen ein und die so ausgezeichneten Methoden kann man dann nicht debuggen. Warum MS das eingebaut hat bleibt mir ein Rätsel…

Entladen einer Klasse (bzw. genauer: Eines Typs) alleine geht nicht. Es lassen sich nur ganze AppDomain s entladen und dabei werden auch alle Typen entladen, die in die betreffende AppDomain geladen wurden.
Normalerweise bekommt man von diesen AppDomains nichts mit, es wird beim Programmstart eine Default-AppDomain angelegt, in die dann die Startklasse geladen wird. Du kannst Dir aber auch selbst weitere AppDomains anlegen und dort Assemblies laden, Typen daraus instanziieren und Methoden dieser Objekte ausführen. Solche selbst angelegten AppDomains kann man dann auch wieder entladen (AppDomain.Unload()).

Gruß,
Martin