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 4 Weitere Datentypen
Pfeil 4.1 Module
Pfeil 4.2 Strukturen
Pfeil 4.2.1 Vor- und Nachteile von Referenz- und Werttypen
Pfeil 4.2.2 Initialisierung und Konstruktoren
Pfeil 4.2.3 Boxing
Pfeil 4.2.4 Innere Strukturen
Pfeil 4.2.5 ValueType
Pfeil 4.3 Enumerationen
Pfeil 4.3.1 Datentyp
Pfeil 4.3.2 System.Enum
Pfeil 4.4 Generisches
Pfeil 4.4.1 Einschränkungen
Pfeil 4.4.2 Innere generische Typen
Pfeil 4.4.3 Vererbung und Überladung
Pfeil 4.4.4 Sichtbarkeit
Pfeil 4.4.5 Bindung
Pfeil 4.4.6 Rekursive Typen
Pfeil 4.4.7 Generische Typen in .NET
Pfeil 4.5 Werttypen mit dem Wert Nothing
Pfeil 4.5.1 Typumwandlungen
Pfeil 4.5.2 Logische Operatoren
Pfeil 4.5.3 Boxing
Pfeil 4.6 Anonyme Klassen
Pfeil 4.6.1 Automatische Namen
Pfeil 4.6.2 Schlüssel und Equals
Pfeil 4.6.3 Innere anonyme Klassen
Pfeil 4.6.4 Generierter Code
Pfeil 4.7 Spezielle Typen
Pfeil 4.8 Attribute
Pfeil 4.8.1 Beispiel: Bedingte Kompilierung
Pfeil 4.8.2 Codeerzeugung: DesignerGenerated
Pfeil 4.8.3 Standardinstanzen: MyGroupCollectionAttribute
Pfeil 4.8.4 Klassenerweiterungen: Extension
Pfeil 4.8.5 Attribute abfragen
Pfeil 4.8.6 Benutzerdefinierte Attribute


Rheinwerk Computing - Zum Seitenanfang

4.3 Enumerationen Zur nächsten ÜberschriftZur vorigen Überschrift

»Weniger ist mehr.« (Ludwig Mies van der Rohe)

Wenn eine Variable nur eine begrenzte Anzahl an Werten annehmen kann, sollte verhindert werden, dass »falsche« Werte zugewiesen werden können. Eine Prüfung vor jeder Neubelegung ist sehr unkomfortabel und fehlerträchtig. Besser ist es, wenn aufgrund des Datentyps der Variablen lediglich erlaubte Werte zugewiesen werden können. Ein erster Ansatz dazu stützt sich auf die Definition einer Klasse.

Class Farbe 
 
Public Const Kreuz As Integer = 3
 
Public Const Pik As Integer = 2
 
Public Const Herz As Integer = 1
 
Public Const Karo As Integer = 0
End Class

Wenn Sie nun eine Variable vom Typ Farbe definieren, können Sie auf diese Konstanten zugreifen. Obwohl das das Problem im Prinzip löst, ist es keine ideale Lösung. Einerseits ist es relativ viel Tipparbeit für ein paar Werte, und andererseits fehlen alle Funktionen, die mit den Konstanten zusammenhängen, wie etwa die Repräsentation als Zeichenkette oder die Aufzählung aller erlaubten Konstanten. Außerdem wird nicht verhindert, dass inkompatible oder bezüglich eines Vergleichs ungeeignete Typen verwendet werden (zum Vergleichsproblem siehe den Unterabschnitt »Fließkommazahlen als Zähler« in Abschnitt 2.10.2, »For«). Daher bietet Visual Basic einen Datentyp, der sich auf das Wesentliche beschränkt, mit folgender Syntax (optionale Teile stehen in eckigen Klammern, kursiv gesetzte Teile müssen Sie Ihren Erfordernissen anpassen):


[<Modifikatoren>] Enum Enumeration [As Typ] 
  Name
[ = Konstante]
 
[<weitere Werte/Initialisierungen>]
End
Enum

Dabei sind noch ein paar Besonderheiten zu beachten:

  • Als Modifikatoren sind nur Public und Friend erlaubt sowie Shadows, Private und Protected für Enumerationen als Teil anderer Datentypen.
  • Typ darf nur einer der ganzzahligen Primitiven Byte, SByte, UShort, UInt16, Short, Int16, UInteger, UInt32, Integer, Int32, ULong, UInt64, Long oder Int64 sein. Ohne Angabe der As-Klausel ist es Integer.
  • Jedes Mitglied steht in einer eigenen logischen Zeile (logische Zeilen können mit einem Doppelpunkt zu einer Codezeile zusammengefasst werden, siehe Abschnitt 2.2.4, »Anweisungen«).
  • Mitglieder einer Enumeration haben keinerlei Modifikatoren, sondern sie sind implizit Public Const und werden damit über den Klassennamen angesprochen.
  • Name muss innerhalb der Enumeration eindeutig sein.
  • Konstanten müssen zur Compilezeit bekannt sein und zu Typ passen.
  • Mitglieder ohne Initialisierung sind um eins größer als ihre Vorgänger, wobei eine fehlende Initialisierung des ersten Mitglieds durch 0 ersetzt wird.
  • Mitglieder können nur als Konstanten nur für nachfolgende Mitglieder verwendet werden.
  • Eine Konstante darf kleiner sein als das vorherige Mitglied.
  • Eumerationen können weder mit Implements eine Schnittstelle implementieren noch mit Inherits eine Elternklasse festlegen.
  • Andere Arten von Mitgliedern sind verboten, auch ein Klassenkonstruktor.
  • Wie Primitive sind Enumerationswerte unveränderlich.

Als Enumeration ist obige Klasse kürzer formulierbar:

  Enum Farbe 
    Karo
    Herz
    Pik
    Kreuz
 
End Enum

Oder noch kürzer (auch wenn Visual Studio beim Tippen immer wieder versucht, End Enum einzufügen):

Enum Farbe : Karo : Herz : Pik : Kreuz : End Enum

Das folgende Codefragment definiert dieselbe Enumeration auf eine etwas andere Art und gibt in einer Schleife die Werte aus – zusammen mit einem Vergleich mit dem festen Wert pik. Zum Test enthält die Enumeration drei Mitglieder mit gleichem Wert.


'...\Datentypen\Enumerationen\Prinzip.vb

Option Strict On 
Namespace Datentypen

 
Enum Farbe
    Karo
    Pik
= 2
    Kreuz
    Herz
= Karo + 1
    Eichel
= Kreuz
    Treff
= Kreuz
 
End Enum

 
Module Prinzip
   
Sub Test()
     
Dim pik As Farbe = Farbe.Pik
     
For Each f As Farbe In [Enum].GetValues(GetType(Farbe))
        Console
.WriteLine("Farbe {0} mit Wert {1} gleich Pik: {2}", _
                          f
, CType(f, Integer), pik = f)
     
Next
      Console
.ReadLine()
   
End Sub
 
End Module
End Namespace

Die von WriteLine implizit aufgerufene Methode ToString() erzeugt die von uns spezifizierten Namen. Bei mehrdeutigen Werten wird der bezüglich des aus dem Namen gebildeten Hashwerts erste Name genommen, hier der Name Eichel. Die standardmäßige Ausgabe von Namen statt Werten ist der Grund für die Typumwandlung mit CType. Durch sie wird ein String von der ganzen Zahl und nicht dem Enumerationsmitglied erzeugt.

Farbe Karo mit Wert 0 gleich Pik: False 
Farbe Herz mit Wert
1 gleich Pik: False
Farbe Pik mit Wert
2 gleich Pik: True
Farbe Eichel mit Wert
3 gleich Pik: False
Farbe Eichel mit Wert
3 gleich Pik: False
Farbe Eichel mit Wert
3 gleich Pik: False

Hinweis
Wie alle Werttypen wird keine Referenz erzeugt, sondern die Werte werden direkt in dem Block gespeichert, in dem die Enumerationsvariable deklariert ist. Zu den sich daraus ergebenden Effekten vergleiche Abschnitt 4.2.1, »Vor- und Nachteile von Referenz- und Werttypen«, und Abschnitt 4.2.3, »Boxing«.



Rheinwerk Computing - Zum Seitenanfang

4.3.1 Datentyp Zur nächsten ÜberschriftZur vorigen Überschrift

Wenn Sie für eine kleinere Anzahl Konstanten nicht 4 Byte einer Integer-Variablen verbrauchen möchten oder die Werte der Konstanten nicht zu Integer passen, können Sie den Datentyp der Enumeration explizit festlegen. Das folgende Codefragment zeigt dazu zwei Enumerationen mit unterschiedlichem ganzzahligem Typ. Die Werte der ersten sind so gewählt, dass sie jeweils nur ein Bit setzen und als Flags dienen können, die ohne Informationsverlust kombiniert werden können. In der Methode Test() wird mit den Enumerationswerten gerechnet, und sie werden wie jede andere ganze Zahl konvertiert:


'...\Datentypen\Enumerationen\Datentyp.vb

Option Strict On 
Namespace Datentypen

 
Enum Font As Byte
    Kursiv
= 1
    Fett
= 2
    Hervorgeboben
= Kursiv Or Fett
    Unterstrichen
= 4
 
End Enum

 
Enum Einheit As Long
    Meter
= 1
    Erddurchmesser
= 12756000
    AstronomischeEinheit
= 149597870691L
    Parsec
= 30856775812743679L
 
End Enum

 
Module Datentyp
   
Sub Test()
     
Dim art As Font = Font.Unterstrichen Or Font.Kursiv
     
Dim typ As Integer = art
      Console
.Write("Die Schrift ist ")
     
For Each f As Font In [Enum].GetValues(GetType(Font))
       
If (typ And f) = f Then Console.Write(f.ToString() & " ")
     
Next
      Console
.WriteLine("({0}, nicht {1})", art, Font.Fett Or Font.Kursiv)

      Console
.WriteLine("{0} Erddurchmesser bis zur Sonne", _
                     
Einheit.AstronomischeEinheit \ Einheit.Erddurchmesser)
      Console
.WriteLine("Nächste Stern: {0}-mal weiter weg als die Sonne", _
       
CType(1.33 * Einheit.Parsec / Einheit.AstronomischeEinheit, Integer))
      Console
.ReadLine()
   
End Sub
 
End Module
End Namespace

Die Ausgabe bestätigt die korrekte Arbeitsweise. Außerdem ist in der ersten Zeile zu sehen, dass bei einer Kombination von Enumerationswerten die automatische Konvertierung zu den Namen in der Enumeration verloren geht, wenn für den Zahlenwert der Kombination kein Name in der Enumeration vergeben ist .

Die Schrift ist Kursiv Unterstrichen (5, nicht Hervorgeboben) 
11727 Erddurchmesser bis zur Sonne
N
ächste Stern: 274332-mal weiter weg als die Sonne

Enumerationen können auch als Datentyp für Methodenparameter dienen. Das nächste Beispiel nutzt eine Enumeration als Parameter der Methode Info(), da es nur exakt 5 Körper gibt, die von gleichen regelmäßigen Vielecken begrenzt sind.


'...\Datentypen\Enumerationen\Parameter.vb

Option Strict On 
Namespace Datentypen

 
Enum Platonisch
   
: Tetraeder : Würfel : Oktaeder : Dodekaeder : Ikosaeder
 
End Enum

 
Module Parameter

   
Sub Info(ByVal körper As Platonisch)
     
Dim f As String = "{0,10}: {1,2} Ecken, {2,2} Kanten, {3,2} Flächen"
     
Select Case körper
       
Case Platonisch.Tetraeder : Console.WriteLine(f, körper, 4, 6, 4)
       
Case Platonisch.Würfel : Console.WriteLine(f, körper, 8, 12, 6)
       
Case Platonisch.Oktaeder : Console.WriteLine(f, körper, 6, 12, 8)
       
Case Platonisch.Dodekaeder : Console.WriteLine(f,körper, 20, 30, 12)
       
Case Platonisch.Ikosaeder : Console.WriteLine(f, körper, 12, 30, 20)
     
End Select
   
End Sub

   
Sub Test()
     
For Each p As Platonisch In [Enum].GetValues(GetType(Platonisch))
       
Info(p)
     
Next
      Console
.ReadLine()
   
End Sub
 
End Module
End Namespace

Die Ausgabe zeigt einige Eigenschaften aller vollständig regelmäßigen Körper:

 Tetraeder:  4 Ecken,  6 Kanten,  4 Flächen 
    W
ürfel:  8 Ecken, 12 Kanten,  6 Flächen
  Oktaeder
:  6 Ecken, 12 Kanten,  8 Flächen
Dodekaeder
: 20 Ecken, 30 Kanten, 12 Flächen
 Ikosaeder
: 12 Ecken, 30 Kanten, 20 Flächen

Rheinwerk Computing - Zum Seitenanfang

4.3.2 System.Enum topZur vorigen Überschrift

Alle Enumerationen sind von System.Enum abgeleitet. Dies wird vom Compiler erledigt, Sie dürfen eine entsprechende Inherits-Klausel nicht angeben. Nehmen wir ein einfaches Beispiel:

Enum Enumeration As Long 
  Mitglied
= 17
End Enum

Der Compiler passt die Enumeration an und stellt die Vererbungsbeziehung her. Im folgenden Listing sind die Signaturen abgedruckt. System.Enum ist von System.ValueType abgeleitet, das wiederum in Abschnitt 4.2.5, »ValueType«, abgedruckt ist. Als obsolet markierte Mitglieder sind in spitze Klammern gesetzt, vor implementierenden Methoden steht, durch einen Punkt getrennt, die Schnittstelle. Um die Ausgabe nicht zu lang werden zu lassen, sind alle ByVal-Modifikatoren von Methodenparametern sowie die Modifikatoren NotOverridable, Overrides und Overloads ausgelassen. Optionale Parameter sind kursiv gesetzt. Der Name GANZ steht für Byte, SByte, UShort, UInt16, Short, Int16, UInteger, UInt32, Integer, Int32, ULong, UInt64, Long oder Int64, PRIM darf zusätzlich für Boolean, Char, Single, Double oder DateTime stehen. Der Parameter ET ist der Datentyp der Enumeration, W der betrachtete Wert. Die privaten Mitglieder sind der Vollständigkeit halber abgedruckt und nur über Klassen aus dem Namensraum Reflection verwendbar.

Public NotInheritable Class Enumeration : Inherits Enum 
 
Public value__ As Long
 
Public Shared Const Mitglied As Enumeration
End Class

Public MustInherit Class Enum Inherits ValueType

 
'Public

 
Function Equals(obj As Object) As Boolean
 
Function GetHashCode() As Integer
 
Function ToString() As String
 
Function ToString(format As String) As String
 
Function <ToString>(format As String, konv As IFormatProvider) As String

 
Function IComparable.CompareTo(mit As Object) As Integer
 
Function IConvertible.GetTypeCode() As TypeCode

 
Shared Function Parse(ET As Type, W As String, egal As Boolean) As Object
 
Shared Function GetUnderlyingType(ET As Type) As Type
 
Shared Function GetValues(ET As Type) As Array
 
Shared Function GetName(ET As Type, W As Object) As String
 
Shared Function GetNames(ET As Type) As String()
 
Shared Function IsDefined(ET As Type, W As Object) As Boolean
 
Shared Function Format(ET As Type, W As Object, form As String) As String
 
Shared Function ToObject(ET As Type, W As Object) As Object
 
Shared Function ToObject(ET As Type, W As GANZ) As Object

 
'Private

 
Function IConvertible.ToPRIM(konv As IFormatProvider) As PRIM
 
Function Iconvertible.ToType(ET As Type,konv As IFormatProvider) As Object

 
Shared Function InternalCompareTo(o1 As Object, o2 As Object) As Integer
 
Shared Function InternalGetUnderlyingType(ET As Type) As Type
 
Shared Sub InternalGetEnumValues( _
    ET
As Type, ByRef werte As ULong(), ByRef namen As String())
 
Shared Function InternalBoxEnum(ET As Type, W As Long) As Object
 
Function InternalGetValue() As Object
 
Shared Function GetValueField(ET As Type) As FieldInfo
 
Shared Function GetHashEntry(ET As Type) As HashEntry
 
Shared Function InternalGetValueAsString(ET As Type,W As Object) As String
 
Shared Function InternalFormattedHexString(W As Object) As String
 
Shared Function InternalFormat(ET As Type, W As Object) As String
 
Shared Function InternalFlagsFormat(ET As Type, W As Object) As String
 
Shared Function ToUInt64(W As Object) As ULong
 
Shared Function BinarySearch(array As ULong(), W As ULong) As Integer

 
Function GetValue() As Object
 
Function ToHexString() As String

 
Shared enumSeperatorCharArray As Char()
 
Shared intType As Type
 
Shared stringType As Type
 
Shared fieldInfoHash As Hashtable
 
Shared Const enumSeperator As String
 
Shared Const maxHashElements As Integer
 
Class HashEntry Inherits Object
   
Public names As String()
   
Public values As ULong()
 
End Class

End Enum

Daraus können Sie erkennen, dass die Elternklasse aller Enumerationen selbst ein Referenztyp ist (so merkwürdig das auch scheinen mag).



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