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

Galileo Computing - Zum Seitenanfang

9.2 Bereitstellen einer generischen KlasseZur nächsten Überschrift

Generics erlauben die Verwendung von Datentypen, die man zum Zeitpunkt der Entwicklung noch nicht festlegen kann oder will. Dazu wird anstelle eines konkreten Datentyps in der Klassendefinition ein Platzhalter angegeben, der innerhalb von spitzen Klammern steht. Dabei hat sich das Verwenden von Buchstaben eingebürgert. Am häufigsten trifft man auf das »T«, das für »Typ« steht. In der generischen Klasse kann der Platzhalter wie ein regulärer Datentyp verwendet werden.

Im folgenden Beispiel wird gezeigt, wie aus der Klasse Stack des Listings 9.1 eine generische Klasse Stack<T> (gesprochen: »Stack of T« und nicht nur »Stack«) wird.

// Beispiel: ..\Kapitel 9\GenerischerStack

class Stack<T> {
private readonly int size;
private T[] elements;
private int pointer = 0;

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

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

public T 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.2 Beispiel einer generischen »Stack«-Klasse

Instanziieren Sie die generische Klasse Stack<T>, müssen Sie den Platzhalter T, der als generischer Typparameter bezeichnet wird, durch einen konkreten Datentyp ersetzen. In der folgenden Anweisung handelt es sich beispielsweise um int:

Stack<int> stack = new Stack<int>(10);

Aus der Klasse Stack<T> ist nun ein Objekt vom Typ Stack<int> geworden. Alle Member der Klasse, in denen der Typparameter T verwendet wird, ersetzen ihn nun durch den gewählten konkreten Datentyp und akzeptieren nur noch Integer-Werte (siehe Abbildung 9.1).

Abbildung

Abbildung 9.1 Aufruf der »Push«-Methode der Klasse »Stack<int>«

Den Zugriff auf die generische Klasse Stack<int> zeigt nachfolgend die Methode Main. Der Code ist in einen try-Block gefasst, um ausgelöste Ausnahmen behandeln zu können.

static void Main(string[] args) {
try {
Stack<int> stack = new Stack<int>(10);
stack.Push(123);
stack.Push(4711);
stack.Push(34);
for (int i = stack.Length; i > 0; i--) {
Console.WriteLine(stack.Pop());
}
stack.Pop();
}
catch (Exception e) {
Console.WriteLine(e.Message);
}
Console.ReadLine();
}

Listing 9.3 Auswerten des generischen Stacks aus Listing 9.2

In der for-Schleife werden alle Elemente der Reihe nach vom Stack geholt. Um eine Ausnahme zu provozieren, wird, nachdem der Stack bereits geleert ist, ein weiteres Mal die Pop-Methode aufgerufen.

Die .NET-Klassenbibliothek stellt eine generische Klasse Stack<T> im Namespace System.Collections.Generic zur Verfügung und eine nichtgenerische in System.Collections.


Galileo Computing - Zum Seitenanfang

9.2.1 Mehrere generische TypparameterZur nächsten ÜberschriftZur vorigen Überschrift

Die zuvor verwendete generische Klasse Stack<T> definiert einen generischen Datentyp. Je nachdem, wie die Anforderungen an die generische Klasse definiert sind, kann der Bedarf an Typparametern jedoch auch größer sein. Sie könnten durchaus eine Klasse definieren, die zwei oder auch noch mehr generische Typparameter aufweist. Diese werden innerhalb der spitzen Klammern durch ein Komma voneinander getrennt, z. B.: Demo<T, A, B>. Hier handelt es sich sogar um die drei generischen Typparameter T, A und B.


Galileo Computing - Zum Seitenanfang

9.2.2 Vorteile der GenericsZur vorigen Überschrift

Der offensichtlich größte Vorteil der Generics ist deren Typsicherheit. Sie programmieren nur eine Klasse und können diese für unterschiedliche Datentypen prägen. Dass die Datentypen sogar bestimmten Bedingungen unterworfen werden können, lernen Sie im nächsten Abschnitt. Verwenden Sie im Programmcode einen generischen Typ, stellt bereits der Compiler fest, wenn Sie einen unzulässigen Datentyp verwenden. Natürlich sorgt auch die Laufzeitumgebung für die Gewährleistung der Typsicherheit.

Neben der Typsicherheit spricht für die Generics das bessere Leistungsverhalten, insbesondere bei der Verwaltung von Wertetypen. Stellen Sie sich nur einfach vor, Sie würden in einer ArrayList zahlreiche Integer-Werte speichern:

ArrayList liste = new ArrayList();
liste.Add(55);
[...]

Obwohl eine ArrayList sehr komfortabel zu handhaben ist, müssen Wertetypen vor der Zuweisung und bei der Auswertung implizit mit dem Boxing- bzw. Unboxing-Verfahren in Referenztypen umgewandelt werden. Das geht, wie in Abschnitt 6.3 beschrieben, zu Lasten der Anwendungsleistung und macht sich insbesondere bei großen Auflistungen deutlich bemerkbar.



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