Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einführung
2 Grundlagen der Sprachsyntax
3 Klassendesign
4 Weitere Datentypen
5 Multithreading
6 Collections und LINQ
7 Eingabe und Ausgabe
8 Anwendungen: Struktur und Installation
9 Code erstellen und debuggen
10 Einige Basisklassen
11 Windows-Anwendungen erstellen
12 Die wichtigsten Steuerelemente
13 Tastatur- und Mausereignisse
14 MDI-Anwendungen
15 Grafiken mit GDI+
16 Drucken
17 Entwickeln von Steuerelementen
18 Programmiertechniken
19 WPF – Grundlagen
20 Layoutcontainer
21 WPF-Steuerelemente
22 Konzepte von WPF
23 Datenbankverbindung mit ADO.NET
24 Datenbankabfragen mit ADO.NET
25 DataAdapter
26 Offline mit DataSet
27 Datenbanken aktualisieren
28 Stark typisierte DataSets
A Anhang: Einige Übersichten
Stichwort

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Visual Basic 2008 von Andreas Kuehnel, Stephan Leibbrandt
Das umfassende Handbuch
Buch: Visual Basic 2008

Visual Basic 2008
3., aktualisierte und erweiterte Auflage, geb., mit DVD
1.323 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1171-0
Pfeil 3 Klassendesign
Pfeil 3.1 Objektorientierung
Pfeil 3.1.1 Einführung
Pfeil 3.1.2 Vorteile
Pfeil 3.1.3 Klassenimplementierung in .NET
Pfeil 3.1.4 Klassen in Visual Basic
Pfeil 3.1.5 Projekttyp »Klassenbibliothek«
Pfeil 3.1.6 Bemerkung zu den Codefragmenten
Pfeil 3.1.7 Objekte durch New
Pfeil 3.1.8 Ausnahmen mit Throw auslösen
Pfeil 3.1.9 Datentypen
Pfeil 3.1.10 Sichtbarkeit der Klasse
Pfeil 3.1.11 Aufteilung der Definition mit Partial
Pfeil 3.1.12 Grafikbibliothek: Beispiel für Kapitel 3 und 4
Pfeil 3.2 Kapselung
Pfeil 3.2.1 Kombinationen
Pfeil 3.2.2 Private
Pfeil 3.2.3 Sichtbarkeitsmodifikatoren
Pfeil 3.2.4 Lokale Variablen
Pfeil 3.2.5 Softwareschutz
Pfeil 3.2.6 Grafikbibliothek: private Größe des Rechtecks
Pfeil 3.3 Verhalten (Methoden)
Pfeil 3.3.1 Prinzip
Pfeil 3.3.2 Verlassen der Methode
Pfeil 3.3.3 Parameter
Pfeil 3.3.4 Überladung (Overloads)
Pfeil 3.3.5 Rückgabewert
Pfeil 3.3.6 Reine Deklaration mit Partial
Pfeil 3.3.7 Grafikbibliothek: Zugriffsmethoden auf die Größe des Rechtecks
Pfeil 3.4 Bindung
Pfeil 3.4.1 Klassenbindung mit Shared
Pfeil 3.4.2 Klassenkonstruktoren
Pfeil 3.4.3 Externe Funktionen
Pfeil 3.4.4 Grafikbibliothek: Rechteckübergreifendes
Pfeil 3.5 Objektinitialisierung mit Konstruktoren
Pfeil 3.5.1 Objektkonstruktoren
Pfeil 3.5.2 Nichtöffentliche Konstrukturen
Pfeil 3.5.3 Grafikbibliothek: Initialisierung des Rechtecks
Pfeil 3.6 Zustände (Felder)
Pfeil 3.6.1 Deklaration und Initialisierung
Pfeil 3.6.2 Sichtbarkeit
Pfeil 3.6.3 Konstanten: ReadOnly und Const
Pfeil 3.6.4 With
Pfeil 3.6.5 Grafikbibliothek: Konstanten des Rechtecks
Pfeil 3.7 Eigenschaften
Pfeil 3.7.1 Kontrolle beim Aufrufer
Pfeil 3.7.2 Zugriffsmethoden
Pfeil 3.7.3 Getter und Setter: Property
Pfeil 3.7.4 Indexer
Pfeil 3.7.5 Standardeigenschaft: Default
Pfeil 3.7.6 Schreibschutz und Leseschutz: ReadOnly und WriteOnly
Pfeil 3.7.7 Sichtbarkeit
Pfeil 3.7.8 Klammern
Pfeil 3.7.9 Grafikbibliothek: Eigenschaften des Rechtecks
Pfeil 3.8 Innere Klassen
Pfeil 3.8.1 Beziehung zur äußeren Klasse
Pfeil 3.8.2 Sichtbarkeit
Pfeil 3.8.3 Grafikbibliothek: Position des Rechtecks
Pfeil 3.9 Dynamisches Verhalten: Delegate und Function
Pfeil 3.9.1 Funktionszeiger: Delegates
Pfeil 3.9.2 Automatisch generierter Code
Pfeil 3.9.3 Mehrere Aktionen gleichzeitig
Pfeil 3.9.4 Asynchrone Aufrufe
Pfeil 3.9.5 Funktionsobjekte: Function (λ-Ausdrücke)
Pfeil 3.9.6 Umwandlungen
Pfeil 3.9.7 Grafikbibliothek: Vergleich von Rechtecken
Pfeil 3.10 Ereignisse
Pfeil 3.10.1 Ereignis: Event und RaiseEvent
Pfeil 3.10.2 Statische Methodenbindung WithEvents und Handles
Pfeil 3.10.3 Dynamische Methodenbindung: AddHandler und RemoveHandler
Pfeil 3.10.4 Benutzerdefinierte Ereignisse: Custom Event
Pfeil 3.10.5 Umwandlungen
Pfeil 3.10.6 Grafikbibliothek: Größenänderungen von Rechtecken überwachen
Pfeil 3.11 Benutzerdefinierte Operatoren
Pfeil 3.11.1 Prinzip
Pfeil 3.11.2 Überladung
Pfeil 3.11.3 Vergleich
Pfeil 3.11.4 Typumwandlung mit CType: Widening und Narrowing
Pfeil 3.11.5 Wahrheitswerte: IsTrue und IsFalse
Pfeil 3.11.6 Grafikbibliothek: Addition und Umwandlung von Rechtecken
Pfeil 3.12 Alle Klassenelemente
Pfeil 3.12.1 Der Namensraum My
Pfeil 3.13 Vererbung
Pfeil 3.13.1 Klassenbeziehung durch Inherits
Pfeil 3.13.2 Sichtbarkeitsmodifikatoren
Pfeil 3.13.3 Zugriff auf Eltern mit MyBase
Pfeil 3.13.4 Modifikation: Shadows und Overloads (Overrides)
Pfeil 3.13.5 Abstrakte Klassen: MustInherit und MustOverride
Pfeil 3.13.6 Spezifische Catch-Blöcke
Pfeil 3.13.7 Eigene Ausnahmen
Pfeil 3.13.8 Arrays
Pfeil 3.13.9 Grafikbibliothek: neue Vielecke
Pfeil 3.14 Polymorphie
Pfeil 3.14.1 Virtuelle Methoden: Overridable und Overrides
Pfeil 3.14.2 Unterbrechen: Overloads, Shadows und Overrides
Pfeil 3.14.3 Unterbinden: NotInheritable, NotOverridable und MyClass
Pfeil 3.14.4 Konstruktoren
Pfeil 3.14.5 Equals
Pfeil 3.14.6 ToString
Pfeil 3.14.7 Grafikbibliothek: Objektsammlungen
Pfeil 3.15 Schnittstellen: Interface und Implements
Pfeil 3.15.1 Benennungen und Parameter
Pfeil 3.15.2 Schnittstellen und Vererbung
Pfeil 3.15.3 Schnittstellenvererbung
Pfeil 3.15.4 Schnittstelle oder abstrakte Klasse?
Pfeil 3.15.5 Grafikbibliothek: Flächen
Pfeil 3.16 Lebensende eines Objekts
Pfeil 3.16.1 Garbage Collector
Pfeil 3.16.2 Destruktoren
Pfeil 3.16.3 Dispose und Using


Rheinwerk Computing - Zum Seitenanfang

3.16 Lebensende eines Objekts Zur nächsten ÜberschriftZur vorigen Überschrift

Jedes Objekt wird früher oder später nicht mehr gebraucht und beendet seine Existenz. In diesem Zusammenhang sollten Ressourcen freigegeben werden, die mit dem Objekt zusammenhängen. Die folgenden Abschnitte zeigen, welche Automatismen es dazu gibt.


Rheinwerk Computing - Zum Seitenanfang

3.16.1 Garbage Collector Zur nächsten ÜberschriftZur vorigen Überschrift

In Visual Basic wird das komplette Speichermanagement im Hintergrund automatisch erledigt. Wenn es keine Möglichkeit mehr gibt, auf ein Objekt zuzugreifen, ist es nicht mehr erreichbar, und der belegte Speicher kann freigegeben werden. Die einfachste Art, die Unerreichbarkeit selbst zu produzieren, besteht darin, alle Referenzen auf das Objekt mit einem neuen Wert zu belegen, zum Beispiel mit Nothing. Bitte beachten Sie, dass es auch indirekte Referenzen gibt, an die Sie vielleicht nicht sofort denken. Zum Beispiel kann jedes Element eines Arrays auch über eine Referenz auf das gesamte Array erreicht werden. Oft wird ein Objekt auch automatisch unerreichbar, zum Beispiel kann auf eine lokale Variable nach Verlassen einer Methode nicht mehr zugegriffen werden, und der Speicher der (nichtstatischen) Variablen kann freigegeben werden. Damit Sie sich nun nicht selbst um die Entsorgung der unerreichbaren Objekte kümmern müssen, läuft parallel zu Ihrer Anwendung ein Programm niederer Priorität, das automatisch aufräumt und »Garbage Collector« genannt wird.


Wenn der Prozessor nicht ausgelastet ist und immer, wenn der Speicher knapp wird, räumt der Müllsammler auf.


Meistens brauchen (und sollten) Sie sich darum überhaupt nicht kümmern. In seltenen Fällen ist ein Eingriff erwünscht, und die Klasse System.GC stellt die Möglichkeiten in Tabelle 3.28 zur Verfügung (alle Mitglieder sind mit Shared klassengebunden, d. h. der Aufruf erfolgt zum Beispiel mit GC.Collect()):


Tabelle 3.28 Garbage Collector

Art Beschreibung

AddMemoryPressure(bytes)

Kündigt an, dass bald bytes Speicher gebraucht werden.

Collect([generation, [modus]])

Forciert eine Speicherbereinigung.

CollectionCount(generation)

Gibt die Anzahl der Speicherbereinigungen zurück.

GetGeneration(referenz)

Gibt das relative Alter von referenz zurück.

GetTotalMemory(aufgeräumt)

Gibt die Größe des reservierten Speichers zurück.

KeepAlive(objekt)

Verhindert das Aufräumen vom Start der Methode, in der der Aufruf steht, bis zum Aufruf (=> besser am Methodenende).

RemoveMemoryPressure(bytes)

Informiert, dass nichtverwalteter Speicher freigeworden ist.

ReRegisterForFinalize(objekt)

Erlaubt das Ausführen des Destruktors.

SuppressFinalize(objekt)

Verhindert das Ausführen des Destruktors.

WaitForPendingFinalizers()

Hält das Programm an, bis alle wartenden Destruktoren fertig sind.

MaxGeneration

Schreibgeschützte maximale Anzahl von Altersstufen von Objekten.



Hinweis
Objekte, die nur über Referenzen erreichbar sind, die mit WeakReference geschaffen wurden, können jederzeit vom Müllsammler freigegeben werden. Solche Referenzen werden manchmal bei einfach wieder zu erzeugenden Objekten eingesetzt.



Rheinwerk Computing - Zum Seitenanfang

3.16.2 Destruktoren Zur nächsten ÜberschriftZur vorigen Überschrift

Objekte sind nur so lange nutzbar, wie es eine Referenz gibt, über die das Objekt direkt oder indirekt angesprochen werden kann. Dabei gehen Referenzen durch die Neubelegung »verloren«, zum Beispiel mit Nothing. Verlässt der Programmfluss den Gültigkeitsbereich einer lokalen Variablen mit einer Objektreferenz, wird diese automatisch »ungültig« gemacht (Ausnahmen: die Variable ist mit Static gekennzeichnet oder wird in einer verwendbaren puren Funktion verwendet, siehe Abschnitt 3.9.5, »Funktionsobjekte: Function (λ-Ausdrücke)«). Sowie das Objekt nicht mehr nutzbar ist, kann es zerstört werden. Ob und wann dies passiert wird vom Laufzeitsystem bestimmt und gegebenenfalls automatisch erledigt (siehe Abschnitt 3.16.1, »Garbage Collector«). Bevor der Speicher, den das Objekt belegt, endgültig freigegeben wird, ruft das Laufzeitsystem automatisch eine spezielle Methode auf, den sogenannten Destruktor (wenn er definiert ist). Üblicherweise enthält die Methode die Freigabe von Ressourcen, die nicht vom Laufzeitsystem verwaltet werden. Dieser Destruktor hat immer die folgende Syntax, inklusive der Modifikatoren (optionale Teile sind in eckige Klammern gesetzt und kursive Teile müssen Sie Ihren Bedürfnissen anpassen):


Protected Overrides Sub Finalize() 
  [<Anweisungen>] 
End Sub

Als Beispiel dient eine Klasse Pirat mit einem Namensfeld zur leichteren Zuordnung von Ausdrucken des Konstruktors, der Finalize-Methode.


'...\Klassendesign\Destruktoren\Destruktor.vb

Option Strict On 
Namespace Klassendesign 
  Class Pirat

    Private name As String 
    Sub New(ByVal name As String) 
      Me.name = name 
    End Sub

    Protected Overrides Sub Finalize() 
      Console.WriteLine("Pirat {0} lebt grade noch.", name) 
    End Sub 
  End Class 
  ... 
End Namespace

Getestet wird der Destruktor, indem die Referenzen auf ein Objekt vom Typ Pirat neu belegt werden. Die Aufrufe des Müllsammlers GC sind notwendig, um das Aufräumen zu erzwingen. Ohne sie gibt es für das Laufzeitsystem bei einem so kleinen Programm keinen Anlass, nicht mehr erreichbare Objekte zu zerstören. In realen Anwendungen sollten Sie mit solchen Aufrufen sparsam umgehen, da sie recht lange dauern können.


'...\Klassendesign\Destruktoren\Destruktor.vb

Option Strict On 
Namespace Klassendesign 
  ... 
  Module Destruktor 
    Sub Test() 
      Dim pirat As Pirat = New Pirat("Störtebecker") 
      Dim legende As Pirat = pirat

      pirat = Nothing : Console.Write("Pirat vernichtet: ") 
      GC.Collect() : GC.WaitForPendingFinalizers()

      legende = New Pirat("Hook") : Console.Write("Hook als neue Legende: ") 
      GC.Collect() : GC.WaitForPendingFinalizers()

      legende = Nothing : Console.Write("Legende vernichtet: ") 
      GC.Collect() : GC.WaitForPendingFinalizers()

      Console.ReadLine() 
    End Sub 
  End Module 
End Namespace

Die Ausgabe zeigt, dass die Neubelegung der Referenz auf den Pirat »Störtebecker« diesen nicht vernichtet hat. Erst nachdem auch die Referenz auf die Legende umgebogen wurde, kommt es zur Zerstörung. Da auf den Pirat »Hook« nur eine einzige Referenz existiert, reicht eine einzige Neubelegung zu dessen Zerstörung. Die korrekte Ausgabe der Namen zeigt, dass ein voller Zugriff auf das Objekt möglich ist, während der Destruktor ausgeführt wird.

Pirat vernichtet: Hook als neue Legende: Pirat Störtebecker lebt grade noch. 
Legende vernichtet: Pirat Hook lebt grade noch.

Einige Punkte sind bei Destruktoren noch zu beachten:

  • Objekte, deren Typen Destruktoren (Finalize) enthalten, beanspruchen mehr Rechenzeit bei der Freigabe des Objekts.
  • Destruktoren werden im Gegensatz zu Konstruktoren nicht verkettet. Es liegt in Ihrer Verantwortung, den Destruktor der Elternklasse explizit aufzurufen.
  • Eine Ausnahme in einer Finalize-Methode beendet das Programm und sollte daher nur verwendet werden, wenn im Fehlerfall eine sofortige Beendigung erwünscht ist.
  • Wird in Finalize einer Variablen außerhalb der Klasse eine Referenz auf das in Zerstörung befindliche Objekt zugewiesen, müssen Sie die Methode GC.ReRegisterForFinalize(Me) aufrufen, wenn für das wiedererstandene Objekt bei erneuter Zerstörung der Destruktor aufgerufen werden soll.

Hinweis
In sehr vielen Fällen ist die Methode Dispose der Schnittstelle IDisposable geeigneter zum Aufräumen als Finalize.



Rheinwerk Computing - Zum Seitenanfang

3.16.3 Dispose und Using topZur vorigen Überschrift

Sollen Aufräumarbeiten automatisch ausgeführt werden, wenn ein Objekt nicht mehr gebraucht wird, bietet sich eine spezielle Syntax an, die automatisch die Dispose()-Methode des Using-Objekts aufruft (optionale Teile stehen in eckigen Klammern, kursive Bezeichner sind frei wählbar):


Using Variable [As IDisposable = New Typ([<Parameter>])] [, <Variablen>] 
  [<Anweisungen>] 
End Using

Dabei ist zu beachten:

  • Der Typ der Variable in Using muss IDisposable implementieren.
  • Die optionale Initialisierung kann auch mit As New Typ([<Parameter>]) erfolgen.
  • Nur eine Deklaration mit As ohne New ist nicht erlaubt.
  • Wenn initialisiert wird, ist die Variable schreibgeschützt.
  • Dispose() wird auch im Fall einer Ausnahme aufgerufen.
  • Der Aufruf von Dispose() erfolgt auch dann korrekt, wenn eine Using-Referenz (ohne Initialisierung) neu belegt wird.
  • Using v1, v2 : End Using ist äquivalent zu Using v1 : Using v2 : End Using : End Using.

Das folgende Codefragment zeigt eine Klasse Festsaal, die die Schnittstelle IDisposable implementiert. Der auskommentierte Aufruf in Dispose() kann benutzt werden, um ein doppeltes Aufräumen zu verhindern. In der Methode Test() werden in zwei Using-Blöcken je ein vor und ein in Using initialisiertes Objekt vom Typ IDisposable verwendet. Um den Effekt einer Nullreferenz zu testen, wird das vorher initialisierte Objekt neu belegt. Die korrespondierende Anweisung im zweiten Using-Block ist auskommentiert, da die Variable durch die Initialisierung in der Using-Einleitung schreibgeschützt ist und der Compiler einen Fehler melden würde. Der zweite Block testet den Effekt einer Ausnahme.


'...\Klassendesign\Destruktoren\Using.vb

Option Strict On 
Namespace Klassendesign

  Class Festsaal : Implements IDisposable 
    Sub Dispose() Implements IDisposable.Dispose 
      Console.WriteLine("Sauber machen und aufräumen.") 
      'GC.SuppressFinalize(Me) 
    End Sub 
  End Class

  Module Freigeben 
    Sub Test() 
      Dim saal As New Festsaal()

      Using saal 
        saal = Nothing 
      End Using

      Try

        Using kneipe As IDisposable = New Festsaal() 
          'kneipe = Nothing                            'Compilerfehler!! 
          Throw New Exception("Ausnahme in Using") 
        End Using

      Catch ex As Exception 
        Console.WriteLine("Ausnahme {0}", ex.Message) 
      End Try 
      Console.ReadLine() 
    End Sub 
  End Module 
End Namespace

Die Ausgabe bestätigt, dass auch im Fall von Nullreferenzen oder Ausnahmen die Methode Dispose() aufgerufen wird:

Sauber machen und aufräumen. 
Sauber machen und aufräumen. 
Ausnahme Ausnahme in Using

Hinweis
Die Methode Dispose() sollte sicherstellen, dass ein wiederholter Aufruf unschädlich ist, zum Beispiel über eine boolesche Variable als Markierung, dass der Aufruf bereits stattgefunden hat. Diese kann auch in anderen Methoden der Klasse verwendet werden, um zu verhindern, dass Zugriffe auf ein bereits freigegebenes Objekt erfolgen.




Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Visual Basic 2008
Visual Basic 2008
Jetzt Buch bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Rheinwerk-Shop: Visual Basic 2012






 Visual Basic 2012


Zum Rheinwerk-Shop: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Rheinwerk-Shop: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Rheinwerk-Shop: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Rheinwerk-Shop: Windows Presentation Foundation






 Windows Presentation
 Foundation


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern