3.6 Zustände (Felder) 

3.6.1 Deklaration und Initialisierung 

Neben der Initialisierung von Objektfeldern im Konstruktor gibt es die Möglichkeit, diese analog zu lokalen Variablen während der Deklaration direkt mit einem Wert zu belegen. Optionale Teile sind in eckige Klammern gesetzt, kursive Teile müssen Sie Ihren Bedürfnissen anpassen:
[<Modifikatoren>] name As typ [= <Wert>] |
Diese Initialisierung ist sehr empfehlenswert, da sofort klar ist, mit welchem Wert eine Variable ihr Leben beginnt. Damit müssen Sie sich nicht mehr merken, wie der Standardwert einer Variablen lautet. Die erlaubten Modifikatoren zeigt Tabelle 3.7.
Art | Beschreibung |
Sichtbarkeit |
Grad der Öffentlichkeit (siehe Abschnitt 3.2, »Kapselung«) |
Bindung |
Objekt- oder klassenbezogen (siehe Abschnitt 3.4, »Bindung«) |
Redefinition |
Ersatz mit Shadows (siehe Abschnitt 3.13, »Vererbung«) |
Konstanz |
Ob Konstante (siehe Abschnitt 3.6.3, »Konstanten: ReadOnly und Const«) |
Das folgende Codefragment testet die Reihenfolge der Initialisierung der Objektvariablen. Zur Protokollierung durchlaufen alle Initialisierungswerte eine Funktion.
'...\Klassendesign\Felder\Initialisierung.vb |
Option Explicit On
Namespace Klassendesign
Class InitQuadrat
Private höhe As Double = v(0)
Private a As Double = v(-1)
Sub New(ByVal a As Double)
Console.WriteLine("Länge {0} ", Me.a)
Me.a = If(a > 0, a, 1)
Console.WriteLine("Länge {0} ", Me.a)
End Sub
End Class
Module Initialisierung
Function v(ByVal w As Double) As Double
Console.WriteLine("Wert {0} ", w)
Return w
End Function
Sub Test()
Dim re As InitQuadrat = New InitQuadrat(v(7))
Console.ReadLine()
End Sub
End Module
End Namespace
Die Ausgaben zeigen, dass zuerst der Parameter des Konstruktors ausgewertet wird. Danach folgen alle Startwerte der Variablen in der Reihenfolge ihrer Deklaration. Erst danach werden die Anweisungen des Konstruktors ausgeführt. Also: Erst kommen die direkten Initialisierungen, dann kommt der Konstruktor.
Wert 7
Wert 0
Wert –1
Länge –1
Länge 7
Hinweis |
Da die Reihenfolge von verschiedenen mit Partial gekennzeichneten Teilen einer Klasse nicht definiert ist, kann auch über die Reihenfolge der Feldinitialisierungen keine Aussage gemacht werden (innerhalb eines Teils bleibt die Reihenfolge gemäß des Quelltexts erhalten). |
3.6.2 Sichtbarkeit 

Wie bereits in Abschnitt 2.5.5, »Sichtbarkeit und Lebensdauer«, dargestellt wurde, kann auf Objektfelder in jeder Methode zugegriffen werden. Im folgenden Codefragment greifen zwei verschiedene Methoden auf dieselbe Objektvariable a zu:
'...\Klassendesign\Felder\Sichtbarkeit.vb |
Option Explicit On
Namespace Klassendesign
Class VariablesQuadrat
Private a As Double = 3
Sub Wurzel()
a = Math.Sqrt(a)
End Sub
Sub Verdoppeln()
a *= 2
End Sub
Sub Druck()
Console.WriteLine("Fläche {0}.", a * a)
End Sub
End Class
Module Sichtbarkeit
Sub Test()
Dim re As VariablesQuadrat = New VariablesQuadrat()
re.Verdoppeln() : re.Druck()
re.Wurzel() : re.Druck()
re.Verdoppeln() : re.Druck()
Console.ReadLine()
End Sub
End Module
End Namespace
Die Ausgabe bestätigt, dass die Änderungsmethoden beide auf dieselbe Objektvariable zugreifen: Eine vorherige Änderung ist jeweils in der Methode sichtbar.
Fläche 36.
Fläche 6.
Fläche 24.
3.6.3 Konstanten: ReadOnly und Const 

Es gibt in Visual Basic zwei Arten von Konstanten, die durch einen der Modifikator Const oder ReadOnly gekennzeichnet werden (optionale Teile sind in eckige Klammern gesetzt, kursive Teile müssen Sie Ihren Bedürfnissen anpassen):
[<Modifikator>] Const name As typ = wert |
Der Wert der Const-Konstante muss bei der Deklaration erfolgen, während dies bei ReadOnly außerdem im Konstruktor passieren darf. An allen anderen Stellen können die Konstanten nicht geändert werden. Eine ReadOnly-Konstante kann für jedes Objekt verschieden sein; bei Const ist es eine für alle Objekte der Klasse. Das konstante Feld darf dieselben Modifikatoren haben wie jedes andere Feld (siehe Tabelle 3.7: Modifikatoren eines Objektfeldes«). Tabelle 3.8 vergleicht die beiden Arten von Konstanten.
Art | ReadOnly | Const |
Bindung |
Objekt oder Klasse |
Klasse |
Zeitpunkt |
Laufzeit |
Compilezeit |
Intialisierung |
direkt oder Konstruktor |
direkt |
Während die Initialisierungen der ReadOnly-Konstanten vor der Ausführung des Konstruktors in der Reihenfolge ihres Auftretens im Quelltext ausgewertet werden (siehe Abschnitt 3.6.1, »Deklaration und Initialisierung«), garantiert der Compiler für die Const-Konstanten die richtige Reihenfolge.
Das folgende Codefragment testet die verschiedenen Spielarten von Konstanten: klassengebundene Compilerkonstante (Const), klassengebundene Laufzeitkonstante (Shared ReadOnly) und objektgebundene Laufzeitkonstante (ReadOnly). Der Wert der mit Const deklarierten Konstanten wird durch den Compiler ermittelt und ist nach der Deklaration unveränderlich. Jeder Versuch, später einen Wert zuzuweisen – auch im Klassenkonstruktor (Shared Sub New) –, wird vom Compiler zurückgewiesen. Das sieht bei den ReadOnly-Konstanten anders aus. Ihr Wert ist erst nach dem Verlassen des Konstruktors endgültig. Im Code wird während der Deklaration ein Wert zugewiesen und dann im Konstruktor geändert. Eine Zuweisung an jeder anderen Stelle wird vom Compiler zurückgewiesen. Bitte beachten Sie, dass eine Klassenkonstante nur im Klassenkonstruktor belegt werden darf, während für Objektkonstanten nur der Objektkonstruktor in Frage kommt. Die letzte Zeile vor ReadLine zeigt, dass die Objektreferenz, die in einer Konstanten gespeichert ist, konstant ist, während das Objekt, auf das sie zeigt, geändert werden darf.
'...\Klassendesign\Felder\Konstanten.vb |
Option Explicit On
Namespace Klassendesign
Class Zeit
Friend Zugriff As Date
Friend Const Quelltext As Date = #1/8/2008 12:28:12 PM#
Friend Shared ReadOnly Klasseninit As Date = Quelltext
Friend ReadOnly Feldinit As Date = Quelltext
Shared Sub New()
Klasseninit = Now
End Sub
Sub New(ByVal zeit As Date)
Me.Feldinit = zeit
End Sub
End Class
Module Konstanten
Sub Test()
Dim re As Zeit = New Zeit(Now)
Console.WriteLine("Quelltext {0}", Zeit.Quelltext)
Console.WriteLine("Feldinit {0}", re.Feldinit)
Console.WriteLine("Klasseninit {0}", Zeit.Klasseninit)
re.Zugriff = Now 'Zeiger ist konstant, nicht Objekt
Console.ReadLine()
End Sub
End Module
End Namespace
Die Ausgabe bestätigt, dass die ReadOnly-Konstanten im korrespondierenden Konstruktor einen neuen Wert erhalten haben:
Quelltext 1/8/2008 12:28:12 PM
Feldinit 1/9/2008 4:15:51 PM
Klasseninit 1/9/2008 4:15:51 PM
Hinweis |
Wenn eine Konstante auf ein Objekt zeigt, darf dieses geändert, aber nicht vollständig ersetzt werden (konstanter Zeiger auf veränderbares Objekt). |
3.6.4 With 

Ganz im Gegensatz zur sonstigen Syntax unterstützt Visual Basic Tippfaule, wenn es darum geht, mehrfach auf dasselbe Objekt oder dieselben Objekte zuzugreifen (optionale Teile sind in eckige Klammern gesetzt und kursive Teile passen Sie Ihren Bedürfnissen an):
With objekt |
Das folgende Codefragment benutzt With, um mehrere Felder desselben Objekts auszulesen:
'...\Klassendesign\Bindung\With.vb |
Option Explicit On
Namespace Klassendesign
Class Rechteck
Sub New()
Console.WriteLine("Rechteck")
End Sub
Friend a As Double = 7, b As Double = 5
End Class
Module WithAbkürzung
Sub Test()
With New Rechteck()
Console.WriteLine("a = {0}", .a)
Console.WriteLine("b = {0}", .b)
End With
Console.ReadLine()
End Sub
End Module
End Namespace
Die Ausgabe zeigt, dass der Ausdruck in With nur einmalig ausgewertet wurde (sonst hätte der Konstruktor von Rechteck mehrere Ausgaben generiert):
Rechteck
a = 7
b = 5
Hinweis |
Analog wird der Zugriff auf Standardeigenschaften mittels des Ausrufezeichens unterstützt (siehe Abschnitt 3.7.5, »Standardeigenschaft: Default«). |
3.6.5 Grafikbibliothek: Konstanten des Rechtecks 

In diesem Abschnitt erweitern wir die in Abschnitt 3.1.12, »Grafikbibliothek: Beispiel für Kapitel 3 und 4«, eingeführte und zuletzt in Abschnitt 3.5.3, »Grafikbibliothek: Initialisierung des Rechtecks«, erweiterte Grafikanwendung. Hier fügen wir nur eine Konstante hinzu:
'...\Klassendesign\Graphik\Felder.vb |
Option Explicit On
Namespace Klassendesign
Partial Public Class Rechteck
Public Const Winkel As Double = 90
End Class
End Namespace
Der Zugriff auf die Konstante erfolgt über den Klassennamen, da mit Const deklarierte Compilerkonstanten implizit an die Klasse gebunden sind.
'...\Klassendesign\Zeichner\Felder.vb |
Option Explicit On
Namespace Klassendesign
Partial Class Zeichner
Sub Felder()
Console.WriteLine("Winkel im Rechteck: {0} Grad", Rechteck.Winkel)
End Sub
End Class
End Namespace
Zur Kontrolle sehen Sie hier die Ausgabe der Methode Felder():
Winkel im Rechteck: 90 Grad
Die nächste Erweiterung erfolgt in Abschnitt 3.7.9, »Grafikbibliothek: Eigenschaften des Rechtecks«.
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.