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 10 Einige Basisklassen
Pfeil 10.1 Object
Pfeil 10.1.1 Methoden
Pfeil 10.1.2 GetType
Pfeil 10.1.3 Gleichheit
Pfeil 10.1.4 Objekte kopieren
Pfeil 10.2 String
Pfeil 10.2.1 Erzeugung
Pfeil 10.2.2 Eigenschaften
Pfeil 10.2.3 Methoden
Pfeil 10.3 Ausgabeformatierung
Pfeil 10.3.1 Formatierung mit der Methode String.Format
Pfeil 10.3.2 Formatierung mit ToString
Pfeil 10.3.3 Benutzerdefinierte Formatierung
Pfeil 10.4 StringBuilder
Pfeil 10.4.1 Kapazität
Pfeil 10.4.2 Konstruktoren
Pfeil 10.4.3 Eigenschaften
Pfeil 10.4.4 Methoden
Pfeil 10.5 Zeitmessung
Pfeil 10.5.1 Die Zeitspanne Tick
Pfeil 10.5.2 Konstruktoren von DateTime
Pfeil 10.5.3 Eigenschaften von DateTime
Pfeil 10.5.4 Methoden von DateTime
Pfeil 10.5.5 Zeitspanne: TimeSpan

Dieses Kapitel fasst die fundamentalen Klassen Object, String, StringBuilder, DateTime und TimeSpan zusammen und geht auf Besonderheiten ein, die nützlich für fortgeschrittene Programmierung sind.

10 Einige Basisklassen


Rheinwerk Computing - Zum Seitenanfang

10.1 Object Zur nächsten ÜberschriftZur vorigen Überschrift

Diese Klasse ist als Wurzel der Klassenhierarchie die einzige, die von keiner anderen Klasse abgeleitet ist. Wenn Sie keine explizite Elternklasse angeben, fügt der Compiler implizit Object ein. Die Funktionalität dieses gemeinsamen Vorfahrs teilen alle Objekte.


Rheinwerk Computing - Zum Seitenanfang

10.1.1 Methoden Zur nächsten ÜberschriftZur vorigen Überschrift

Sieben Methoden vererbt die Klasse Object an Subklassen: fünf öffentliche und zwei, die mit Protected auf Nachfahren beschränkt sind (siehe Tabelle 10.1).


Tabelle 10.1 Methoden von »Object« (O = Overridable, P = Protected, S = Shared)

Methode Beschreibung

New

Parameterloser Konstruktor

Equals

Gibt an, ob das gegebene Objekt diesem gleich ist.

O

Finalize

Aufgerufen bei Zerstörung des Objekts (z. B. Ressourcenfreigabe)

P

GetHashCode

Objektspezifischer Identifizierer (nicht garantiert eindeutig)

O

GetType

Eine Type-Instanz, die den Typ des Objekts beschreibt

MemberwiseClone

Dupliziert die aktuelle Instanz und liefert die Referenz der Kopie.

P

ReferenceEquals

Gibt an, ob die beiden Referenzen auf dasselbe Objekt zeigen.

S

ToString

Liefert den vollqualifizierenden Namen einer Klasse.

O



Hinweis
Wenn Equals Objekte inhaltlich vergleichen soll, muss die zugrunde liegende Klasse die Methode Equals neu definieren (siehe Abschnitt 3.14.5, »Equals«) oder den Gleichheitsoperator = überladen (siehe Abschnitt 3.11.3, »Vergleich«).


Den Nutzen der Methode ToString habe ich bereits in Abschnitt 3.14.6, »ToString«, angedeutet. Hier möchte ich nur noch auf das Standardverhalten hinweisen, das den vollqualifizierten Klassennamen liefert, ohne Objekte derselben Klasse zu unterscheiden. Viele Klassen überschreiben das Verhalten, zum Beispiel Zahlenprimitive wie Double und Zeichenketten.


Public Overridable Function ToString() As String

Finalize wurde bereits in Abschnitt 3.16.2, »Destruktoren«, gezeigt. Die anderen Methoden werden in den folgenden Abschnitten behandelt.


Rheinwerk Computing - Zum Seitenanfang

10.1.2 GetType Zur nächsten ÜberschriftZur vorigen Überschrift

Zur Laufzeit liegen für jeden Datentyp Metainformationen vor, die in einem Type-Objekt gespeichert sind.


Public Function [GetType]() As Type

Um den Rahmen dieses Kapitels nicht zu sprengen, zeigt das folgende Beispiel nur eine ganz einfache Typanalyse. Mit den Klassen im Namensraum System.Reflection können Sie zur Laufzeit mit etwas Aufwand sogar neue Datentypen erzeugen.


'...\Basisklassen\KlasseObject\GetType.vb

Option Strict On 
Namespace Basisklassen

 
Class Kind
   
Public Feld As Integer = 9
 
End Class

 
Class Enkel : Inherits Kind : End Class

 
Module [GetType]
   
Private Sub Eltern(ByVal type As Type)
     
If type IsNot GetType(Object) Then Eltern(type.BaseType)
      Console
.Write(type.Name & " ")
   
End Sub

   
Sub Test()
     
Dim kind As New Enkel()
     
Dim kindertyp As Type = kind.GetType()
      Console
.WriteLine(kindertyp.Assembly.FullName)
      Eltern
(kindertyp)
     
For Each fi As System.Reflection.FieldInfo In kindertyp.GetFields()
        Console
.Write(fi.Name & "=" & fi.GetValue(kind).ToString())
     
Next
      Console
.ReadLine()
   
End Sub
 
End Module
End Namespace

Rheinwerk Computing - Zum Seitenanfang

10.1.3 Gleichheit Zur nächsten ÜberschriftZur vorigen Überschrift

Wie in Abschnitt 3.1.9, »Datentypen«, bereits erläutert wurde, muss bei Gleichheit von Objekten zwischen Objektreferenzen auf identische Objekte und Objekten mit gleichen (oder sogar denselben) Werten unterschieden werden. Sowohl Equals als auch ReferenceEquals in der Klasse Object verstehen unter Gleichheit die Identität zweier Referenzen. Für einen inhaltlichen Vergleich muss die Methode Equals in einer Kindklasse überschrieben werden.


Public Overridable Function Equals(obj As Object) As Boolean 
Public Shared Function Equals(objA As Object, objB As Object) As Boolean
Public Shared Function ReferenceEquals(a As Object, b As Object) As Boolean


Hinweis
Auch wenn die Methode Equals der Schnittstelle IEquatable(Of T) als typsicher bevorzugt werden sollte, kann sie die Methode in Object nicht ersetzen, sondern nur ergänzen.


Was Sie als »gleich« ansehen, bleibt Ihnen überlassen. In der Regel werden die Werte der Felder herangezogen. Im folgenden Beispiel hat die Klasse Ball keine Felder, und verschiedene Bälle werden nicht unterschieden; Equals gibt True zurück. So hält der Torwart einen Ball und nicht den Ball. Bitte beachten Sie den Test auf eine Nullreferenz und korrekten Typ in der Methode Equals, die als Parametertyp immer Object hat.


'...\Basisklassen\KlasseObject\Feldgleichheit.vb

Option Strict On 
Namespace Basisklassen
 
Module Feldgleichheit

   
Class Ball
     
Public Overrides Function Equals(ByVal obj As Object) As Boolean
       
If obj Is Nothing OrElse Not TypeOf obj Is Ball Then Return False
       
Return True
     
End Function
   
End Class

   
Class Spieler
     
Friend ball As Ball
   
End Class

   
Sub Test()
     
Dim regulär As New Ball(), zuviel As New Ball()
     
Dim stürmer As New Spieler : stürmer.ball = regulär
     
Dim torwart As New Spieler : torwart.ball = zuviel
      Console
.WriteLine("Stürmerball ähnelt Torwartball: {0}", _
                        st
ürmer.ball.Equals(torwart.ball))
      Console
.WriteLine("Stürmerball ist Torwartball: {0}", _
                       
Object.ReferenceEquals(stürmer.ball, torwart.ball))
      Console
.ReadLine()
   
End Sub
 
End Module
End Namespace

Der Schiedsrichter wird sich wohl auf den zweiten Vergleich stützen.

Stürmerball ähnelt Torwartball: True 
St
ürmerball ist Torwartball: False

Nicht immer wird die Methode Equals zur Definition von Gleichheit herangezogen. Viele Funktionen nutzen aus Effizienzgründen die Methode GetHashCode, zum Beispiel einige der Auflistungen:


Public Overridable Function GetHashCode() As Integer

Wenn Sie Ihren Klassen eine eigene Vorstellung von Gleichheit mitgeben wollen, gilt daher:


Equals() und GetHashCode() sollten immer gemeinsam überschrieben werden.


Das folgende Beispiel weist auf das Problem hin. Obwohl die verwendete Auflistung GetHashCode zur Sortierung benutzt, müssen beide Methoden in Ware überschrieben werden. Wird nur eine weggelassen, wird das Objekt nach der Änderung nicht mehr gefunden.


'...\Basisklassen\KlasseObject\Boxing.vb

Option Strict On 
Namespace Basisklassen
 
Module Boxing

   
Structure Ware
     
Public Menge, Preis As Double

     
Public Overrides Function Equals(ByVal obj As Object) As Boolean
       
If obj Is Nothing OrElse Not TypeOf obj Is Ware Then Return False
       
Return CType(obj, Ware).Preis.Equals(Preis)
     
End Function

     
Public Overrides Function GetHashCode() As Integer
       
Return Preis.GetHashCode()
     
End Function
   
End Structure

   
Sub Test()
     
Dim waren As New HashSet(Of Ware)
     
Dim mehl As New Ware() : mehl.Preis = 0.52 : waren.Add(mehl)
      Console
.WriteLine("Mehl gefunden: {0}", waren.Contains(mehl))
      mehl
.Menge = 0.54
      Console
.WriteLine("Mehl gefunden: {0}", waren.Contains(mehl))
      Console
.ReadLine()
   
End Sub
 
End Module
End Namespace

Der Compiler sucht sich für einen Methodenaufruf immer den am besten passenden Typ heraus. Aus diesem Grund wurde die Schnittstelle IEquatable(Of T) geschaffen. Sie stellt das typisierte Pendant zu Equals() dar. Diese Möglichkeit entbindet Sie aber nicht von der Notwendigkeit, auch die allgemeine Equals()-Methode zu definieren (und damit auch GetHashCode()), denn nicht in jeder Situation hat der Compiler genügend Informationen, um die am besten passende Methode zu wählen.


Rheinwerk Computing - Zum Seitenanfang

10.1.4 Objekte kopieren topZur vorigen Überschrift

Die Methode MemberwiseClone kopiert ein vorhandenes Objekt und liefert die Referenz auf die Kopie:


Protected Function MemberwiseClone() As Object

Von allen Feldern wird eine sogenannte flache Kopie erzeugt. Speichert ein Feld eine Objektreferenz, wird die Referenz als solche kopiert, nicht aber das Objekt, auf das sie zeigt. Durch den Zugriffsmodifizierer können Sie die Methode nicht von außerhalb der Klassenhierarchie aufrufen. Für diesen Zweck gibt es die Schnittstelle ICloneable.


Public Interface ICloneable 
 
Function Clone() As Object
End Interface

Damit lässt sich nun einfach eine Kopierfunktion erstellen. Das folgende Beispiel nutzt MemberwiseClone, um eine flache Kopie zu erzeugen. Innerhalb von Clone wird für das Feld Clone aufgerufen, um eine tiefe Kopie zu erzeugen:


'...\Basisklassen\KlasseObject\Kopie.vb

Option Strict On 
Namespace Basisklassen
 
Module Kopie

   
Class Gemälde : Implements ICloneable
     
Public Wert As Single = Rnd()
     
Public Function Clone() As Object Implements ICloneable.Clone
       
Return Me.MemberwiseClone()
     
End Function
   
End Class

   
Class Fälscher : Implements ICloneable
     
Public obj As New Gemälde()
     
Public Function Clone() As Object Implements ICloneable.Clone
       
Dim kopie As Fälscher = CType(Me.MemberwiseClone(), Fälscher)
        kopie
.obj = CType(obj.Clone(), Gemälde)
       
Return kopie
     
End Function
   
End Class

   
Sub Test()
     
Dim meister As New Fälscher()
     
Dim stift As Fälscher = CType(meister.Clone(), Fälscher)
      Console
.WriteLine("Selben Fälscher {0}", meister Is stift)
      Console
.WriteLine("Selben Gemälde {0}", meister.obj Is stift.obj)
      Console
.WriteLine("Selben Werte {0}", meister.obj.Wert = stift.obj.Wert)
      Console
.ReadLine()
   
End Sub
 
End Module
End Namespace

Hinweis
Wenn Feldvariablen Arrays speichern, müssen diese für eine tiefe Kopie erst kopiert werden, bevor die Einzelelemente geklont werden.


Die Ausgabe zeigt, dass eine tiefe Kopie erzeugt wurde:

Selben Fälscher False 
Selben Gem
älde False
Selben Werte
True


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