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

Inhaltsverzeichnis
Vorwort zur 6. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Das Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Strukturen und Enumerationen
7 Fehlerbehandlung und Debugging
8 Auflistungsklassen (Collections)
9 Generics – Generische Datentypen
10 Weitere C#-Sprachfeatures
11 LINQ
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 XML
15 Multithreading und die Task Parallel Library (TPL)
16 Einige wichtige .NET-Klassen
17 Projektmanagement und Visual Studio 2012
18 Einführung in die WPF und XAML
19 WPF-Layout-Container
20 Fenster in der WPF
21 WPF-Steuerelemente
22 Elementbindungen
23 Konzepte von WPF
24 Datenbindung
25 Weitere Möglichkeiten der Datenbindung
26 Dependency Properties
27 Ereignisse in der WPF
28 WPF-Commands
29 Benutzerdefinierte Controls
30 2D-Grafik
31 ADO.NET – Verbindungsorientierte Objekte
32 ADO.NET – Das Command-Objekt
33 ADO.NET – Der SqlDataAdapter
34 ADO.NET – Daten im lokalen Speicher
35 ADO.NET – Aktualisieren der Datenbank
36 Stark typisierte DataSets
37 Einführung in das ADO.NET Entity Framework
38 Datenabfragen des Entity Data Models (EDM)
39 Entitätsaktualisierung und Zustandsverwaltung
40 Konflikte behandeln
41 Plain Old CLR Objects (POCOs)
Stichwort

Download:
- Beispiele, ca. 62,4 MB

Buch bestellen
Ihre Meinung?

Spacer
Visual C# 2012 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2012

Visual C# 2012
Rheinwerk Computing
1402 S., 6., aktualisierte und erweiterte Auflage 2013, geb., mit DVD
49,90 Euro, ISBN 978-3-8362-1997-6
Pfeil 9 Generics – Generische Datentypen
Pfeil 9.1 Problembeschreibung
Pfeil 9.2 Bereitstellen einer generischen Klasse
Pfeil 9.2.1 Mehrere generische Typparameter
Pfeil 9.2.2 Vorteile der Generics
Pfeil 9.3 Bedingungen (Constraints) festlegen
Pfeil 9.3.1 Constraints mit der »where«-Klausel
Pfeil 9.3.2 Typparameter auf Klassen oder Strukturen beschränken
Pfeil 9.3.3 Mehrere Constraints definieren
Pfeil 9.3.4 Der Konstruktor-Constraint »new()«
Pfeil 9.3.5 Das Schlüsselwort »default«
Pfeil 9.4 Generische Methoden
Pfeil 9.4.1 Methoden und Constraints
Pfeil 9.5 Generics und Vererbung
Pfeil 9.5.1 Virtuelle generische Methoden
Pfeil 9.6 Konvertierung von Generics
Pfeil 9.7 Generische Delegates
Pfeil 9.7.1 Generische Delegates und Constraints
Pfeil 9.7.2 Anpassung des Beispiels »GeometricObjects«
Pfeil 9.8 Nullable-Typen
Pfeil 9.8.1 Konvertierungen mit Nullable-Typen
Pfeil 9.9 Generische Collections
Pfeil 9.9.1 Die Interfaces der generischen Auflistungsklassen
Pfeil 9.9.2 Die generische Auflistungsklasse »List<T>«
Pfeil 9.9.3 Vergleiche mit Hilfe des Delegaten »Comparison<T>«
Pfeil 9.10 Kovarianz und Kontravarianz generischer Typen
Pfeil 9.10.1 Kovarianz mit Interfaces
Pfeil 9.10.2 Kontravarianz mit Interfaces
Pfeil 9.10.3 Zusammenfassung
Pfeil 9.10.4 Generische Delegaten mit varianten Typparametern

9 Generics – Generische DatentypenZur nächsten Überschrift


Galileo Computing - Zum Seitenanfang

9.1 ProblembeschreibungZur vorigen Überschrift

In der Programmierung dienen Variablen als Platzhalter für Daten. Die Idee, die hinter den Generics steckt, geht noch einen konsequenten Schritt weiter. Generics sind ebenfalls Platzhalter, allerdings für Datentypen. Mit Generics lassen sich Klassen und Methoden definieren, für die bestimmte Datentypen geprägt sind. Lassen Sie mich diese Aussage sofort an dem konkreten Beispiel zeigen. Dazu dient die benutzerdefinierte Klasse Stack mit den beiden Methoden Push und Pop als Ausgangspunkt der Überlegungen. Die Klasse sei zunächst noch »klassisch« definiert.

class Stack {
private readonly int size;
private Object[] elements;
private int pointer = 0;

public Stack(int size) {
this.size = size;
elements = new Object[size];
}

public void Push(Object element) {
if (pointer >= this.size)
throw new StackOverflowException();
elements[pointer] = element;
pointer++;
}

public Object Pop() {
pointer--;
if (pointer >= 0)
return elements[pointer];
else {
pointer = 0;
throw new InvalidOperationException("Der Stack ist leer");
}
}

public int Length {
get { return this.pointer; }
}
}

Listing 9.1 Die Definition einer Klasse, die einen allgemeinen Stack beschreibt

Die internen Daten werden in einem Object-Array gespeichert. Instanziiert werden kann diese Klasse über den Aufruf des einfach parametrisierten Konstruktors, dem ein int übergeben wird, mit dem die Größe des internen Arrays initialisiert wird.

Mit Push wird der Stack-Instanz ein Objekt übergeben. Sollte zu diesem Zeitpunkt die Kapazität des Arrays bereits ausgeschöpft sein, ist eine Ausnahme die Folge. Mit einer Ausnahme reagiert auch die Methode Pop, falls ein weiteres Element abgerufen wird, das Array aber bereits geleert ist und kein weiteres Element mehr enthält.

Jedes vom Stack-Objekt im Array verwaltete Element ist vom Typ Object. Das ist für eine Auswertung jedoch nicht präzise genug, was dazu führt, dass das Element in den richtigen Typ konvertiert werden muss. Das folgende Codefragment soll das verdeutlichen:

Stack stack = new Stack(10);
stack.Push(2);
int str = (int)stack.Pop();

Würden wir versuchen, das vom Stack geholte Element beispielsweise in eine Zeichenfolge zu konvertieren, also

string str = (string)stack.Pop();

wäre das Auslösen einer Ausnahme vom Typ InvalidCastException die unweigerliche Folge. Wie Sie sehen können, birgt die Flexibilität des Typs Object gravierende Nachteile in sich. Sie können natürlich versuchen, mehrere Klassen zu entwickeln, die auf einen bestimmten Datentyp spezialisiert sind, z. B.:

public class StackInt {
private int[] elemente

public void Push(int number) {...}
[...]
}

Damit wäre gewährleistet, dass ein Objekt dieser Klasse nur Integer verwalten kann. Die Auswertung der einzelnen Objekte macht somit kein Problem. Andererseits führt dieser Ansatz im Extremfall zu einer großen Anzahl ähnlicher Klassen, die jeweils nur für einen spezifischen Typ geeignet sind. Solche Lösungen sind zwar umsetzbar, allerdings schlecht zu warten. Zudem könnte sich in naher oder ferner Zukunft der Bedarf nach einem weiteren Stack mit einem noch nicht berücksichtigten Typ ergeben, so dass man rückblickend mit dem Ergebnis nicht zufrieden wäre. Genau an diesem Punkt spielen Generics ihre ganze Stärke aus.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual C# 2012

Visual C# 2012
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: C/C++






 C/C++


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2013
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.


[Rheinwerk Computing]

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