Doberenz / Gewinnus / Saumweber Visual C# 2017 – Grundlagen, Profiwissen und Rezepte
1. Auflage 2018
ISBN: 978-3-446-45370-8
Verlag: Carl Hanser
Format: PDF
Kopierschutz: 1 - PDF Watermark
E-Book, Deutsch, 951 Seiten
ISBN: 978-3-446-45370-8
Verlag: Carl Hanser
Format: PDF
Kopierschutz: 1 - PDF Watermark
Mit diesem Buch haben Sie den idealen Begleiter für Ihre tägliche Arbeit und zugleich - dank der erfrischenden und unterhaltsamen Sprache - eine spannende Lektüre, die Lust macht, auch Projekte in der Freizeit umzusetzen.
Das Buch gliedert sich in einen Grundlagenteil zur Programmierung mit Visual Studio 2017 und C# 7.0 und einen Technologieteil zu fortgeschrittenen Themen.
Im Internet finden Sie darüber hinaus zum Download Beispiele und Bonuskapitel zu Windows Presentation Foundation (WPF) und Windows Forms-Anwendungen.
Walter Saumweber hat langjährige Erfahrung als Entwickler, Berater und Dozent. Er ist Autor von zahlreichen Fachbüchern und Beiträgen in Computer-Fachzeitschriften und -Onlineportalen.
Autoren/Hrsg.
Fachgebiete
Weitere Infos & Material
1;Inhalt;7
2;Vorwort;23
3;TEIL I: Grundlagen;27
3.1;1 Einstieg in Visual Studio 2017;29
3.1.1;1.1 Die Installation von Visual Studio 2017;29
3.1.1.1;1.1.1 Überblick über die Produktpalette;29
3.1.1.2;1.1.2 Anforderungen an Hard- und Software;30
3.1.2;1.2 Unser allererstes C#-Programm;31
3.1.2.1;1.2.1 Vorbereitungen;31
3.1.2.2;1.2.2 Quellcode schreiben;33
3.1.2.3;1.2.3 Programm kompilieren und testen;33
3.1.2.4;1.2.4 Einige Erläuterungen zum Quellcode;34
3.1.2.5;1.2.5 Konsolenanwendungen sind out;35
3.1.3;1.3 Die Windows-Philosophie;36
3.1.3.1;1.3.1 Mensch-Rechner-Dialog;36
3.1.3.2;1.3.2 Objekt- und ereignisorientierte Programmierung;36
3.1.3.3;1.3.3 Programmieren mit Visual Studio 2017;38
3.1.4;1.4 Die Entwicklungsumgebung Visual Studio 2017;39
3.1.4.1;1.4.1 Neues Projekt;39
3.1.4.2;1.4.2 Die wichtigsten Fenster;40
3.1.5;1.5 Microsofts .NET-Technologie;44
3.1.5.1;1.5.1 Zur Geschichte von .NET;44
3.1.5.2;1.5.2 .NET-Features und Begriffe;46
3.1.6;1.6 Praxisbeispiele;54
3.1.6.1;1.6.1 Unsere erste Windows-Forms-Anwendung;54
3.1.6.2;1.6.2 Umrechnung Euro-Dollar;58
3.2;2 Grundlagen der Sprache C#;67
3.2.1;2.1 Grundbegriffe;67
3.2.1.1;2.1.1 Anweisungen;67
3.2.1.2;2.1.2 Bezeichner;68
3.2.1.3;2.1.3 Schlüsselwörter;69
3.2.1.4;2.1.4 Kommentare;70
3.2.2;2.2 Datentypen, Variablen und Konstanten;71
3.2.2.1;2.2.1 Fundamentale Typen;71
3.2.2.2;2.2.2 Wertetypen versus Verweistypen;72
3.2.2.3;2.2.3 Benennung von Variablen;73
3.2.2.4;2.2.4 Deklaration von Variablen;73
3.2.2.5;2.2.5 Typsuffixe;75
3.2.2.6;2.2.6 Zeichen und Zeichenketten;75
3.2.2.7;2.2.7 object-Datentyp;78
3.2.2.8;2.2.8 Konstanten deklarieren;79
3.2.2.9;2.2.9 Nullable Types;79
3.2.2.10;2.2.10 Typinferenz;80
3.2.2.11;2.2.11 Gültigkeitsbereiche und Sichtbarkeit;81
3.2.3;2.3 Konvertieren von Datentypen;82
3.2.3.1;2.3.1 Implizite und explizite Konvertierung;82
3.2.3.2;2.3.2 Welcher Datentyp passt zu welchem?;84
3.2.3.3;2.3.3 Konvertieren von string;84
3.2.3.4;2.3.4 Die Convert-Klasse;87
3.2.3.5;2.3.5 Die Parse-Methode;87
3.2.3.6;2.3.6 Boxing und Unboxing;88
3.2.4;2.4 Operatoren;89
3.2.4.1;2.4.1 Arithmetische Operatoren;90
3.2.4.2;2.4.2 Zuweisungsoperatoren;92
3.2.4.3;2.4.3 Logische Operatoren;93
3.2.4.4;2.4.4 Rangfolge der Operatoren;95
3.2.5;2.5 Kontrollstrukturen;97
3.2.5.1;2.5.1 Verzweigungsbefehle;97
3.2.5.2;2.5.2 Schleifenanweisungen;100
3.2.6;2.6 Benutzerdefinierte Datentypen;103
3.2.6.1;2.6.1 Enumerationen;103
3.2.6.2;2.6.2 Strukturen;105
3.2.7;2.7 Nutzerdefinierte Methoden;107
3.2.7.1;2.7.1 Methoden mit Rückgabewert;108
3.2.7.2;2.7.2 Methoden ohne Rückgabewert;109
3.2.7.3;2.7.3 Parameterübergabe mit ref;110
3.2.7.4;2.7.4 Parameterübergabe mit out;111
3.2.7.5;2.7.5 Methodenüberladung;112
3.2.7.6;2.7.6 Optionale Parameter;113
3.2.7.7;2.7.7 Benannte Parameter;115
3.2.8;2.8 Praxisbeispiele;116
3.2.8.1;2.8.1 Vom PAP zur Konsolenanwendung;116
3.2.8.2;2.8.2 Ein Konsolen- in ein Windows-Programm verwandeln;118
3.2.8.3;2.8.3 Schleifenanweisungen verstehen;120
3.2.8.4;2.8.4 Benutzerdefinierte Methoden überladen;122
3.2.8.5;2.8.5 Anwendungen von Visual Basic nach C# portieren;125
3.3;3 OOP-Konzepte;133
3.3.1;3.1 Kleine Einführung in die OOP;133
3.3.1.1;3.1.1 Historische Entwicklung;134
3.3.1.2;3.1.2 Grundbegriffe der OOP;135
3.3.1.3;3.1.3 Sichtbarkeit von Klassen und ihren Mitgliedern;137
3.3.1.4;3.1.4 Allgemeiner Aufbau einer Klasse;138
3.3.1.5;3.1.5 Das Erzeugen eines Objekts;140
3.3.1.6;3.1.6 Einführungsbeispiel;143
3.3.2;3.2 Eigenschaften;147
3.3.2.1;3.2.1 Eigenschaften mit Zugriffsmethoden kapseln;147
3.3.2.2;3.2.2 Berechnete Eigenschaften;149
3.3.2.3;3.2.3 Lese-/Schreibschutz;151
3.3.2.4;3.2.4 Property-Accessoren;152
3.3.2.5;3.2.5 Statische Felder/Eigenschaften;152
3.3.2.6;3.2.6 Einfache Eigenschaften automatisch implementieren;155
3.3.3;3.3 Methoden;156
3.3.3.1;3.3.1 Öffentliche und private Methoden;156
3.3.3.2;3.3.2 Überladene Methoden;157
3.3.3.3;3.3.3 Statische Methoden;158
3.3.4;3.4 Ereignisse;160
3.3.4.1;3.4.1 Ereignis hinzufügen;160
3.3.4.2;3.4.2 Ereignis verwenden;163
3.3.5;3.5 Arbeiten mit Konstruktor und Destruktor;166
3.3.5.1;3.5.1 Konstruktor und Objektinitialisierer;167
3.3.5.2;3.5.2 Destruktor und Garbage Collector;170
3.3.5.3;3.5.3 Mit using den Lebenszyklus des Objekts kapseln;172
3.3.5.4;3.5.4 Verzögerte Initialisierung;173
3.3.6;3.6 Vererbung und Polymorphie;174
3.3.6.1;3.6.1 Klassendiagramm;174
3.3.6.2;3.6.2 Method-Overriding;175
3.3.6.3;3.6.3 Klassen implementieren;175
3.3.6.4;3.6.4 Implementieren der Objekte;179
3.3.6.5;3.6.5 Ausblenden von Mitgliedern durch Vererbung;180
3.3.6.6;3.6.6 Allgemeine Hinweise und Regeln zur Vererbung;182
3.3.6.7;3.6.7 Polymorphes Verhalten;183
3.3.6.8;3.6.8 Die Rolle von System.Object;186
3.3.7;3.7 Spezielle Klassen;187
3.3.7.1;3.7.1 Abstrakte Klassen;187
3.3.7.2;3.7.2 Versiegelte Klassen;189
3.3.7.3;3.7.3 Partielle Klassen;189
3.3.7.4;3.7.4 Statische Klassen;191
3.3.8;3.8 Schnittstellen (Interfaces);191
3.3.8.1;3.8.1 Definition einer Schnittstelle;192
3.3.8.2;3.8.2 Implementieren einer Schnittstelle;192
3.3.8.3;3.8.3 Abfragen, ob Schnittstelle vorhanden ist;193
3.3.8.4;3.8.4 Mehrere Schnittstellen implementieren;194
3.3.8.5;3.8.5 Schnittstellenprogrammierung ist ein weites Feld ...;194
3.3.9;3.9 Praxisbeispiele;195
3.3.9.1;3.9.1 Eigenschaften sinnvoll kapseln;195
3.3.9.2;3.9.2 Eine statische Klasse anwenden;198
3.3.9.3;3.9.3 Vom fetten zum schlanken Client;200
3.3.9.4;3.9.4 Schnittstellenvererbung verstehen;210
3.3.9.5;3.9.5 Rechner für komplexe Zahlen;215
3.3.9.6;3.9.6 Sortieren mit IComparable/IComparer;224
3.3.9.7;3.9.7 Einen Objektbaum in generischen Listen abspeichern;228
3.3.9.8;3.9.8 OOP beim Kartenspiel erlernen;234
3.3.9.9;3.9.9 Eine Klasse zur Matrizenrechnung entwickeln;239
3.4;4 Arrays, Strings, Funktionen;245
3.4.1;4.1 Datenfelder (Arrays);245
3.4.1.1;4.1.1 Array deklarieren;246
3.4.1.2;4.1.2 Array instanziieren;246
3.4.1.3;4.1.3 Array initialisieren;247
3.4.1.4;4.1.4 Zugriff auf Array-Elemente;248
3.4.1.5;4.1.5 Zugriff mittels Schleife;249
3.4.1.6;4.1.6 Mehrdimensionale Arrays;250
3.4.1.7;4.1.7 Zuweisen von Arrays;252
3.4.1.8;4.1.8 Arrays aus Strukturvariablen;253
3.4.1.9;4.1.9 Löschen und Umdimensionieren von Arrays;254
3.4.1.10;4.1.10 Eigenschaften und Methoden von Arrays;255
3.4.1.11;4.1.11 Übergabe von Arrays;257
3.4.2;4.2 Verarbeiten von Zeichenketten;258
3.4.2.1;4.2.1 Zuweisen von Strings;258
3.4.2.2;4.2.2 Eigenschaften und Methoden von String-Variablen;259
3.4.2.3;4.2.3 Wichtige Methoden der String-Klasse;262
3.4.2.4;4.2.4 Die StringBuilder-Klasse;264
3.4.3;4.3 Reguläre Ausdrücke;267
3.4.3.1;4.3.1 Wozu werden reguläre Ausdrücke verwendet?;267
3.4.3.2;4.3.2 Eine kleine Einführung;267
3.4.3.3;4.3.3 Wichtige Methoden/Eigenschaften der Klasse Regex;268
3.4.3.4;4.3.4 Kompilierte reguläre Ausdrücke;270
3.4.3.5;4.3.5 RegexOptions-Enumeration;271
3.4.3.6;4.3.6 Metazeichen (Escape-Zeichen);272
3.4.3.7;4.3.7 Zeichenmengen (Character Sets);273
3.4.3.8;4.3.8 Quantifizierer;275
3.4.3.9;4.3.9 Zero-Width Assertions;276
3.4.3.10;4.3.10 Gruppen;280
3.4.3.11;4.3.11 Text ersetzen;280
3.4.3.12;4.3.12 Text splitten;281
3.4.4;4.4 Datums- und Zeitberechnungen;282
3.4.4.1;4.4.1 Die DateTime-Struktur;282
3.4.4.2;4.4.2 Wichtige Eigenschaften von DateTime-Variablen;284
3.4.4.3;4.4.3 Wichtige Methoden von DateTime-Variablen;284
3.4.4.4;4.4.4 Wichtige Mitglieder der DateTime-Struktur;285
3.4.4.5;4.4.5 Konvertieren von Datumstrings in DateTime-Werte;286
3.4.4.6;4.4.6 Die TimeSpan-Struktur;287
3.4.5;4.5 Mathematische Funktionen;289
3.4.5.1;4.5.1 Überblick;289
3.4.5.2;4.5.2 Zahlen runden;289
3.4.5.3;4.5.3 Winkel umrechnen;290
3.4.5.4;4.5.4 Potenz- und Wurzeloperationen;290
3.4.5.5;4.5.5 Logarithmus und Exponentialfunktionen;290
3.4.5.6;4.5.6 Zufallszahlen erzeugen;291
3.4.6;4.6 Zahlen- und Datumsformatierungen;292
3.4.6.1;4.6.1 Anwenden der ToString-Methode;292
3.4.6.2;4.6.2 Anwenden der Format-Methode;294
3.4.6.3;4.6.3 Stringinterpolation;295
3.4.7;4.7 Praxisbeispiele;296
3.4.7.1;4.7.1 Zeichenketten verarbeiten;296
3.4.7.2;4.7.2 Zeichenketten mit StringBuilder addieren;299
3.4.7.3;4.7.3 Reguläre Ausdrücke testen;303
3.4.7.4;4.7.4 Methodenaufrufe mit Array-Parametern;304
3.5;5 Weitere Sprachfeatures;309
3.5.1;5.1 Namespaces (Namensräume);309
3.5.1.1;5.1.1 Ein kleiner Überblick;309
3.5.1.2;5.1.2 Einen eigenen Namespace einrichten;310
3.5.1.3;5.1.3 Die using-Anweisung;311
3.5.1.4;5.1.4 Namespace Alias;312
3.5.2;5.2 Operatorenüberladung;313
3.5.2.1;5.2.1 Syntaxregeln;313
3.5.2.2;5.2.2 Praktische Anwendung;313
3.5.3;5.3 Collections (Auflistungen);314
3.5.3.1;5.3.1 Die Schnittstelle IEnumerable;315
3.5.3.2;5.3.2 ArrayList;317
3.5.3.3;5.3.3 Hashtable;319
3.5.3.4;5.3.4 Indexer;319
3.5.4;5.4 Generics;322
3.5.4.1;5.4.1 Klassische Vorgehensweise;322
3.5.4.2;5.4.2 Generics bieten Typsicherheit;324
3.5.4.3;5.4.3 Generische Methoden;325
3.5.4.4;5.4.4 Iteratoren;326
3.5.5;5.5 Generische Collections;327
3.5.5.1;5.5.1 List-Collection statt ArrayList;327
3.5.5.2;5.5.2 Vorteile generischer Collections;328
3.5.5.3;5.5.3 Constraints;328
3.5.6;5.6 Das Prinzip der Delegates;329
3.5.6.1;5.6.1 Delegates sind Methodenzeiger;329
3.5.6.2;5.6.2 Einen Delegate-Typ deklarieren;329
3.5.6.3;5.6.3 Ein Delegate-Objekt erzeugen;330
3.5.6.4;5.6.4 Delegates vereinfacht instanziieren;332
3.5.6.5;5.6.5 Anonyme Methoden;332
3.5.6.6;5.6.6 Lambda-Ausdrücke;334
3.5.6.7;5.6.7 Lambda-Ausdrücke in der Task Parallel Library;336
3.5.7;5.7 Dynamische Programmierung;338
3.5.7.1;5.7.1 Wozu dynamische Programmierung?;338
3.5.7.2;5.7.2 Das Prinzip der dynamischen Programmierung;338
3.5.7.3;5.7.3 Optionale Parameter sind hilfreich;341
3.5.7.4;5.7.4 Kovarianz und Kontravarianz;342
3.5.8;5.8 Weitere Datentypen;343
3.5.8.1;5.8.1 BigInteger;343
3.5.8.2;5.8.2 Complex;345
3.5.8.3;5.8.3 Tuple<>;346
3.5.8.4;5.8.4 SortedSet<>;347
3.5.9;5.9 Praxisbeispiele;348
3.5.9.1;5.9.1 ArrayList versus generische List;348
3.5.9.2;5.9.2 Generische IEnumerable-Interfaces implementieren;351
3.5.9.3;5.9.3 Delegates, anonyme Methoden, Lambda Expressions;355
3.5.9.4;5.9.4 Dynamischer Zugriff auf COM Interop;359
3.6;6 Einführung in LINQ;363
3.6.1;6.1 LINQ-Grundlagen;363
3.6.1.1;6.1.1 Die LINQ-Architektur;363
3.6.1.2;6.1.2 Anonyme Typen;365
3.6.1.3;6.1.3 Erweiterungsmethoden;366
3.6.2;6.2 Abfragen mit LINQ to Objects;367
3.6.2.1;6.2.1 Grundlegendes zur LINQ-Syntax;368
3.6.2.2;6.2.2 Zwei alternative Schreibweisen von LINQ-Abfragen;369
3.6.2.3;6.2.3 Übersicht der wichtigsten Abfrageoperatoren;370
3.6.3;6.3 LINQ-Abfragen im Detail;371
3.6.3.1;6.3.1 Die Projektionsoperatoren Select und SelectMany;372
3.6.3.2;6.3.2 Der Restriktionsoperator Where;374
3.6.3.3;6.3.3 Die Sortierungsoperatoren OrderBy und ThenBy;374
3.6.3.4;6.3.4 Der Gruppierungsoperator GroupBy;376
3.6.3.5;6.3.5 Verknüpfen mit Join;378
3.6.3.6;6.3.6 Aggregat-Operatoren;379
3.6.3.7;6.3.7 Verzögertes Ausführen von LINQ-Abfragen;381
3.6.3.8;6.3.8 Konvertierungsmethoden;382
3.6.3.9;6.3.9 Abfragen mit PLINQ;383
3.6.4;6.4 Praxisbeispiele;386
3.6.4.1;6.4.1 Die Syntax von LINQ-Abfragen verstehen;386
3.6.4.2;6.4.2 Aggregat-Abfragen mit LINQ;389
3.6.4.3;6.4.3 LINQ im Schnelldurchgang erlernen;391
3.6.4.4;6.4.4 Strings mit LINQ abfragen und filtern;394
3.6.4.5;6.4.5 Duplikate aus einer Liste oder einem Array entfernen;395
3.6.4.6;6.4.6 Arrays mit LINQ initialisieren;398
3.6.4.7;6.4.7 Arrays per LINQ mit Zufallszahlen füllen;400
3.6.4.8;6.4.8 Einen String mit Wiederholmuster erzeugen;402
3.6.4.9;6.4.9 Mit LINQ Zahlen und Strings sortieren;403
3.6.4.10;6.4.10 Mit LINQ Collections von Objekten sortieren;404
3.6.4.11;6.4.11 Ergebnisse von LINQ-Abfragen in ein Array kopieren;407
3.7;7 C#-Sprachneuerungen im Überblick;409
3.7.1;7.1 C# 4.0 – Visual Studio 2010;409
3.7.1.1;7.1.1 Datentyp dynamic;409
3.7.1.2;7.1.2 Benannte und optionale Parameter;410
3.7.1.3;7.1.3 Covarianz und Contravarianz;412
3.7.2;7.2 C# 5.0 – Visual Studio 2012;412
3.7.2.1;7.2.1 Async und Await;412
3.7.2.2;7.2.2 CallerInfo;412
3.7.3;7.3 Visual Studio 2013;413
3.7.4;7.4 C# 6.0 – Visual Studio 2015;413
3.7.4.1;7.4.1 String Interpolation;413
3.7.4.2;7.4.2 Schreibgeschützte AutoProperties;413
3.7.4.3;7.4.3 Initialisierer für AutoProperties;414
3.7.4.4;7.4.4 Expression Body Funktionsmember;414
3.7.4.5;7.4.5 using static;414
3.7.4.6;7.4.6 Bedingter Nulloperator;415
3.7.4.7;7.4.7 Ausnahmenfilter;415
3.7.4.8;7.4.8 nameof-Ausdrücke;416
3.7.4.9;7.4.9 await in catch und finally;416
3.7.4.10;7.4.10 Indexinitialisierer;416
3.7.5;7.5 C# 7.0 – Visual Studio 2017;417
3.7.5.1;7.5.1 out-Variablen;417
3.7.5.2;7.5.2 Tupel;417
3.7.5.3;7.5.3 Mustervergleich;418
3.7.5.4;7.5.4 Discards;420
3.7.5.5;7.5.5 Lokale ref-Variablen und Rückgabetypen;420
3.7.5.6;7.5.6 Lokale Funktionen;420
3.7.5.7;7.5.7 Mehr Expression-Bodied Member;420
3.7.5.8;7.5.8 throw-Ausdrücke;421
3.7.5.9;7.5.9 Verbesserung der numerischen literalen Syntax;421
4;Teil II: Technologien;423
4.1;8 Zugriff auf das Dateisystem;425
4.1.1;8.1 Grundlagen;425
4.1.1.1;8.1.1 Klassen für den Zugriff auf das Dateisystem;426
4.1.1.2;8.1.2 Statische versus Instanzen-Klasse;426
4.1.2;8.2 Übersichten;427
4.1.2.1;8.2.1 Methoden der Directory-Klasse;428
4.1.2.2;8.2.2 Methoden eines DirectoryInfo-Objekts;428
4.1.2.3;8.2.3 Eigenschaften eines DirectoryInfo-Objekts;428
4.1.2.4;8.2.4 Methoden der File-Klasse;429
4.1.2.5;8.2.5 Methoden eines FileInfo-Objekts;430
4.1.2.6;8.2.6 Eigenschaften eines FileInfo-Objekts;430
4.1.3;8.3 Operationen auf Verzeichnisebene;431
4.1.3.1;8.3.1 Existenz eines Verzeichnisses/einer Datei feststellen;431
4.1.3.2;8.3.2 Verzeichnisse erzeugen und löschen;431
4.1.3.3;8.3.3 Verzeichnisse verschieben und umbenennen;432
4.1.3.4;8.3.4 Aktuelles Verzeichnis bestimmen;432
4.1.3.5;8.3.5 Unterverzeichnisse ermitteln;433
4.1.3.6;8.3.6 Alle Laufwerke ermitteln;433
4.1.3.7;8.3.7 Dateien kopieren und verschieben;434
4.1.3.8;8.3.8 Dateien umbenennen;435
4.1.3.9;8.3.9 Dateiattribute feststellen;435
4.1.3.10;8.3.10 Verzeichnis einer Datei ermitteln;437
4.1.3.11;8.3.11 Alle im Verzeichnis enthaltenen Dateien ermitteln;437
4.1.3.12;8.3.12 Dateien und Unterverzeichnisse ermitteln;438
4.1.4;8.4 Zugriffsberechtigungen;439
4.1.4.1;8.4.1 ACL und ACE;439
4.1.4.2;8.4.2 SetAccessControl-Methode;439
4.1.4.3;8.4.3 Zugriffsrechte anzeigen;440
4.1.5;8.5 Weitere wichtige Klassen;441
4.1.5.1;8.5.1 Die Path-Klasse;441
4.1.5.2;8.5.2 Die Klasse FileSystemWatcher;442
4.1.5.3;8.5.3 Die Klasse ZipArchive;443
4.1.6;8.6 Datei- und Verzeichnisdialoge;445
4.1.6.1;8.6.1 OpenFileDialog und SaveFileDialog;445
4.1.6.2;8.6.2 FolderBrowserDialog;447
4.1.7;8.7 Praxisbeispiele;448
4.1.7.1;8.7.1 Infos über Verzeichnisse und Dateien gewinnen;448
4.1.7.2;8.7.2 Eine Verzeichnisstruktur in die TreeView einlesen;451
4.1.7.3;8.7.3 Mit LINQ und RegEx Verzeichnisbäume durchsuchen;454
4.2;9 Dateien lesen und schreiben;459
4.2.1;9.1 Grundprinzip der Datenpersistenz;459
4.2.1.1;9.1.1 Dateien und Streams;459
4.2.1.2;9.1.2 Die wichtigsten Klassen;460
4.2.1.3;9.1.3 Erzeugen eines Streams;461
4.2.2;9.2 Dateiparameter;461
4.2.2.1;9.2.1 FileAccess;461
4.2.2.2;9.2.2 FileMode;462
4.2.2.3;9.2.3 FileShare;462
4.2.3;9.3 Textdateien;463
4.2.3.1;9.3.1 Eine Textdatei beschreiben bzw. neu anlegen;463
4.2.3.2;9.3.2 Eine Textdatei lesen;464
4.2.4;9.4 Binärdateien;466
4.2.4.1;9.4.1 Lese-/Schreibzugriff;466
4.2.4.2;9.4.2 Die Methoden ReadAllBytes und WriteAllBytes;467
4.2.4.3;9.4.3 Erzeugen von BinaryReader/BinaryWriter;467
4.2.5;9.5 Sequenzielle Dateien;468
4.2.5.1;9.5.1 Lesen und Schreiben von strukturierten Daten;468
4.2.5.2;9.5.2 Serialisieren von Objekten;469
4.2.6;9.6 Dateien verschlüsseln und komprimieren;470
4.2.6.1;9.6.1 Das Methodenpärchen Encrypt/Decrypt;470
4.2.6.2;9.6.2 Verschlüsseln unter Windows Vista/7/8/10;471
4.2.6.3;9.6.3 Verschlüsseln mit der CryptoStream-Klasse;472
4.2.6.4;9.6.4 Dateien komprimieren;473
4.2.7;9.7 Memory Mapped Files;474
4.2.7.1;9.7.1 Grundprinzip;474
4.2.7.2;9.7.2 Erzeugen eines MMF;475
4.2.7.3;9.7.3 Erstellen eines Map View;475
4.2.8;9.8 Praxisbeispiele;476
4.2.8.1;9.8.1 Auf eine Textdatei zugreifen;476
4.2.8.2;9.8.2 Einen Objektbaum persistent speichern;480
4.2.8.3;9.8.3 Ein Memory Mapped File (MMF) verwenden;487
4.2.8.4;9.8.4 Hex-Dezimal-Bytes-Konverter;489
4.2.8.5;9.8.5 Eine Datei verschlüsseln;493
4.2.8.6;9.8.6 Eine Datei komprimieren;496
4.2.8.7;9.8.7 PDFs erstellen/exportieren;498
4.2.8.8;9.8.8 Eine CSV-Datei erstellen;501
4.2.8.9;9.8.9 Eine CSV-Datei mit LINQ lesen und auswerten;504
4.2.8.10;9.8.10 Einen korrekten Dateinamen erzeugen;506
4.3;10 Asynchrone Programmierung;507
4.3.1;10.1 Übersicht;507
4.3.1.1;10.1.1 Multitasking versus Multithreading;508
4.3.1.2;10.1.2 Deadlocks;509
4.3.1.3;10.1.3 Racing;510
4.3.2;10.2 Programmieren mit Threads;511
4.3.2.1;10.2.1 Einführungsbeispiel;512
4.3.2.2;10.2.2 Wichtige Thread-Methoden;513
4.3.2.3;10.2.3 Wichtige Thread-Eigenschaften;515
4.3.2.4;10.2.4 Einsatz der ThreadPool-Klasse;516
4.3.3;10.3 Sperrmechanismen;518
4.3.3.1;10.3.1 Threading ohne lock;518
4.3.3.2;10.3.2 Threading mit lock;520
4.3.3.3;10.3.3 Die Monitor-Klasse;522
4.3.3.4;10.3.4 Mutex;526
4.3.3.5;10.3.5 Methoden für die parallele Ausführung sperren;527
4.3.3.6;10.3.6 Semaphore;528
4.3.4;10.4 Interaktion mit der Programmoberfläche;529
4.3.4.1;10.4.1 Die Werkzeuge;530
4.3.4.2;10.4.2 Einzelne Steuerelemente mit Invoke aktualisieren;530
4.3.4.3;10.4.3 Mehrere Steuerelemente aktualisieren;532
4.3.4.4;10.4.4 Ist ein Invoke-Aufruf nötig?;532
4.3.4.5;10.4.5 Und was ist mit WPF?;533
4.3.5;10.5 Timer-Threads;535
4.3.6;10.6 Die BackgroundWorker-Komponente;536
4.3.7;10.7 Asynchrone Programmierentwurfsmuster;538
4.3.7.1;10.7.1 Kurzübersicht;539
4.3.7.2;10.7.2 Polling;540
4.3.7.3;10.7.3 Callback verwenden;542
4.3.7.4;10.7.4 Callback mit Parameterübergabe verwenden;542
4.3.7.5;10.7.5 Callback mit Zugriff auf die Programmoberfläche;544
4.3.8;10.8 Asynchroner Aufruf beliebiger Methoden;545
4.3.8.1;10.8.1 Die Beispielklasse;545
4.3.8.2;10.8.2 Asynchroner Aufruf ohne Callback;546
4.3.8.3;10.8.3 Asynchroner Aufruf mit Callback und Anzeigefunktion;547
4.3.8.4;10.8.4 Aufruf mit Rückgabewerten (per Eigenschaft);548
4.3.8.5;10.8.5 Aufruf mit Rückgabewerten (per EndInvoke);549
4.3.9;10.9 Es geht auch einfacher – async und await;550
4.3.9.1;10.9.1 Der Weg von synchron zu asynchron;550
4.3.9.2;10.9.2 Achtung: Fehlerquellen!;552
4.3.9.3;10.9.3 Eigene asynchrone Methoden entwickeln;554
4.3.10;10.10 Praxisbeispiele;557
4.3.10.1;10.10.1 Spieltrieb & Multithreading erleben;557
4.3.10.2;10.10.2 Prozess- und Thread-Informationen gewinnen;570
4.3.10.3;10.10.3 Ein externes Programm starten;575
4.4;11 Die Task Parallel Library;579
4.4.1;11.1 Überblick;579
4.4.1.1;11.1.1 Parallel-Programmierung;579
4.4.1.2;11.1.2 Möglichkeiten der TPL;582
4.4.1.3;11.1.3 Der CLR-Threadpool;582
4.4.2;11.2 Parallele Verarbeitung mit Parallel.Invoke;583
4.4.2.1;11.2.1 Aufrufvarianten;584
4.4.2.2;11.2.2 Einschränkungen;585
4.4.3;11.3 Verwendung von Parallel.For;585
4.4.3.1;11.3.1 Abbrechen der Verarbeitung;587
4.4.3.2;11.3.2 Auswerten des Verarbeitungsstatus;588
4.4.3.3;11.3.3 Und was ist mit anderen Iterator-Schrittweiten?;589
4.4.4;11.4 Collections mit Parallel.ForEach verarbeiten;590
4.4.5;11.5 Die Task-Klasse;591
4.4.5.1;11.5.1 Einen Task erzeugen;591
4.4.5.2;11.5.2 Den Task starten;592
4.4.5.3;11.5.3 Datenübergabe an den Task;594
4.4.5.4;11.5.4 Wie warte ich auf das Ende des Task?;595
4.4.5.5;11.5.5 Tasks mit Rückgabewerten;597
4.4.5.6;11.5.6 Die Verarbeitung abbrechen;600
4.4.5.7;11.5.7 Fehlerbehandlung;604
4.4.5.8;11.5.8 Weitere Eigenschaften;605
4.4.6;11.6 Zugriff auf das User-Interface;606
4.4.6.1;11.6.1 Task-Ende und Zugriff auf die Oberfläche;606
4.4.6.2;11.6.2 Zugriff auf das UI aus dem Task heraus;608
4.4.7;11.7 Weitere Datenstrukturen im Überblick;610
4.4.7.1;11.7.1 Threadsichere Collections;610
4.4.7.2;11.7.2 Primitive für die Threadsynchronisation;611
4.4.8;11.8 Parallel LINQ (PLINQ);611
4.4.9;11.9 Praxisbeispiel: Spieltrieb – Version 2;611
4.4.9.1;11.9.1 Aufgabenstellung;612
4.4.9.2;11.9.2 Global-Klasse;612
4.4.9.3;11.9.3 Controller-Klasse;613
4.4.9.4;11.9.4 LKW-Klasse;615
4.4.9.5;11.9.5 Schiff-Klasse;616
4.4.9.6;11.9.6 Oberfläche;619
4.5;12 Fehlersuche und Behandlung;621
4.5.1;12.1 Der Debugger;621
4.5.1.1;12.1.1 Allgemeine Beschreibung;621
4.5.1.2;12.1.2 Die wichtigsten Fenster;622
4.5.1.3;12.1.3 Debugging-Optionen;625
4.5.1.4;12.1.4 Praktisches Debugging am Beispiel;628
4.5.2;12.2 Arbeiten mit Debug und Trace;632
4.5.2.1;12.2.1 Wichtige Methoden von Debug und Trace;632
4.5.2.2;12.2.2 Besonderheiten der Trace-Klasse;636
4.5.2.3;12.2.3 TraceListener-Objekte;637
4.5.3;12.3 Caller Information;639
4.5.3.1;12.3.1 Attribute;639
4.5.3.2;12.3.2 Anwendung;640
4.5.4;12.4 Fehlerbehandlung;641
4.5.4.1;12.4.1 Anweisungen zur Fehlerbehandlung;641
4.5.4.2;12.4.2 try-catch;641
4.5.4.3;12.4.3 try-finally;646
4.5.4.4;12.4.4 Das Standardverhalten bei Ausnahmen festlegen;649
4.5.4.5;12.4.5 Die Exception-Klasse;650
4.5.4.6;12.4.6 Fehler/Ausnahmen auslösen;651
4.5.4.7;12.4.7 Eigene Fehlerklassen;651
4.5.4.8;12.4.8 Exceptionhandling zur Entwurfszeit;653
4.5.4.9;12.4.9 Code Contracts;654
4.6;13 XML in Theorie und Praxis;655
4.6.1;13.1 XML – etwas Theorie;655
4.6.1.1;13.1.1 Übersicht;655
4.6.1.2;13.1.2 Der XML-Grundaufbau;658
4.6.1.3;13.1.3 Wohlgeformte Dokumente;659
4.6.1.4;13.1.4 Processing Instructions (PI);661
4.6.1.5;13.1.5 Elemente und Attribute;662
4.6.1.6;13.1.6 Verwendbare Zeichensätze;663
4.6.2;13.2 XSD-Schemas;666
4.6.2.1;13.2.1 XSD-Schemas und ADO.NET;666
4.6.2.2;13.2.2 XML-Schemas in Visual Studio analysieren;668
4.6.2.3;13.2.3 XML-Datei mit XSD-Schema erzeugen;672
4.6.2.4;13.2.4 XSD-Schema aus einer XML-Datei erzeugen;673
4.6.3;13.3 Verwendung des DOM unter .NET;673
4.6.3.1;13.3.1 Übersicht;673
4.6.3.2;13.3.2 DOM-Integration in C#;675
4.6.3.3;13.3.3 Laden von Dokumenten;675
4.6.3.4;13.3.4 Erzeugen von XML-Dokumenten;676
4.6.3.5;13.3.5 Auslesen von XML-Dateien;678
4.6.3.6;13.3.6 Direktzugriff auf einzelne Elemente;679
4.6.3.7;13.3.7 Einfügen von Informationen;680
4.6.3.8;13.3.8 Suchen in den Baumzweigen;683
4.6.4;13.4 XML-Verarbeitung mit LINQ to XML;686
4.6.4.1;13.4.1 Die LINQ to XML-API;686
4.6.4.2;13.4.2 Neue XML-Dokumente erzeugen;688
4.6.4.3;13.4.3 Laden und Sichern von XML-Dokumenten;690
4.6.4.4;13.4.4 Navigieren in XML-Daten;691
4.6.4.5;13.4.5 Auswählen und Filtern;693
4.6.4.6;13.4.6 Manipulieren der XML-Daten;694
4.6.4.7;13.4.7 XML-Dokumente transformieren;695
4.6.5;13.5 Weitere Möglichkeiten der XML-Verarbeitung;698
4.6.5.1;13.5.1 XML-Daten aus Objektstrukturen erzeugen;698
4.6.5.2;13.5.2 Schnelles Suchen in XML-Daten mit XPathNavigator;702
4.6.5.3;13.5.3 Schnelles Auslesen von XML-Daten mit XmlReader;704
4.6.5.4;13.5.4 Erzeugen von XML-Daten mit XmlWriter;706
4.6.5.5;13.5.5 XML transformieren mit XSLT;708
4.6.6;13.6 JSON – JavaScriptObjectNotation;710
4.6.6.1;13.6.1 Grundlagen;710
4.6.6.2;13.6.2 De-/Serialisierung mit JSON;710
4.6.7;13.7 Praxisbeispiele;713
4.6.7.1;13.7.1 Mit dem DOM in XML-Dokumenten navigieren;713
4.6.7.2;13.7.2 XML-Daten in eine TreeView einlesen;717
4.6.7.3;13.7.3 In Dokumenten mit dem XPathNavigator navigieren;721
4.7;14 Einführung in ADO.NET und Entity Framework;727
4.7.1;14.1 Eine kleine Übersicht;727
4.7.1.1;14.1.1 Die ADO.NET-Klassenhierarchie;727
4.7.1.2;14.1.2 Die Klassen der Datenprovider;729
4.7.1.3;14.1.3 Das Zusammenspiel der ADO.NET-Klassen;731
4.7.2;14.2 Das Connection-Objekt;732
4.7.2.1;14.2.1 Allgemeiner Aufbau;732
4.7.2.2;14.2.2 SqlConnection;732
4.7.2.3;14.2.3 Schließen einer Verbindung;733
4.7.2.4;14.2.4 Eigenschaften des Connection-Objekts;734
4.7.2.5;14.2.5 Methoden des Connection-Objekts;736
4.7.2.6;14.2.6 Der ConnectionStringBuilder;737
4.7.3;14.3 Das Command-Objekt;737
4.7.3.1;14.3.1 Erzeugen und Anwenden eines Command-Objekts;738
4.7.3.2;14.3.2 Erzeugen mittels CreateCommand-Methode;739
4.7.3.3;14.3.3 Eigenschaften des Command-Objekts;739
4.7.3.4;14.3.4 Methoden des Command-Objekts;741
4.7.3.5;14.3.5 Freigabe von Connection- und Command-Objekten;743
4.7.4;14.4 Parameter-Objekte;744
4.7.4.1;14.4.1 Erzeugen und Anwenden eines Parameter-Objekts;744
4.7.4.2;14.4.2 Eigenschaften des Parameter-Objekts;745
4.7.5;14.5 Das CommandBuilder-Objekt;746
4.7.5.1;14.5.1 Erzeugen;746
4.7.5.2;14.5.2 Anwenden;746
4.7.6;14.6 Das DataReader-Objekt;747
4.7.6.1;14.6.1 DataReader erzeugen;747
4.7.6.2;14.6.2 Daten lesen;748
4.7.6.3;14.6.3 Eigenschaften des DataReaders;749
4.7.6.4;14.6.4 Methoden des DataReaders;749
4.7.7;14.7 Das DataAdapter-Objekt;750
4.7.7.1;14.7.1 DataAdapter erzeugen;750
4.7.7.2;14.7.2 Command-Eigenschaften;751
4.7.7.3;14.7.3 Fill-Methode;752
4.7.7.4;14.7.4 Update-Methode;753
4.7.8;14.8 Entity Framework;754
4.7.8.1;14.8.1 Überblick;754
4.7.8.2;14.8.2 DatabaseFirst;756
4.7.8.3;14.8.3 CodeFirst;764
4.7.9;14.9 Praxisbeispiele;769
4.7.9.1;14.9.1 Wichtige ADO.NET-Objekte im Einsatz;769
4.7.9.2;14.9.2 Eine Aktionsabfrage ausführen;771
4.7.9.3;14.9.3 Eine StoredProcedure aufrufen;773
4.7.9.4;14.9.4 Die Datenbank aktualisieren;776
4.8;15 Das DataSet;781
4.8.1;15.1 Grundlegende Features des DataSets;781
4.8.1.1;15.1.1 Die Objekthierarchie;782
4.8.1.2;15.1.2 Die wichtigsten Klassen;782
4.8.1.3;15.1.3 Erzeugen eines DataSets;783
4.8.2;15.2 Das DataTable-Objekt;785
4.8.2.1;15.2.1 DataTable erzeugen;785
4.8.2.2;15.2.2 Spalten hinzufügen;785
4.8.2.3;15.2.3 Zeilen zur DataTable hinzufügen;786
4.8.2.4;15.2.4 Auf den Inhalt einer DataTable zugreifen;787
4.8.3;15.3 Die DataView;789
4.8.3.1;15.3.1 Erzeugen einer DataView;790
4.8.3.2;15.3.2 Sortieren und Filtern von Datensätzen;790
4.8.3.3;15.3.3 Suchen von Datensätzen;791
4.8.4;15.4 Typisierte DataSets;791
4.8.4.1;15.4.1 Ein typisiertes DataSet erzeugen;792
4.8.4.2;15.4.2 Das Konzept der Datenquellen;793
4.8.4.3;15.4.3 Typisierte DataSets und TableAdapter;794
4.8.5;15.5 Die Qual der Wahl;795
4.8.5.1;15.5.1 DataReader – der schnelle Lesezugriff;796
4.8.5.2;15.5.2 DataSet – die Datenbank im Hauptspeicher;796
4.8.5.3;15.5.3 Objektrelationales Mapping – die Zukunft?;797
4.8.6;15.6 Praxisbeispiele;798
4.8.6.1;15.6.1 In der DataView sortieren und filtern;798
4.8.6.2;15.6.2 Suche nach Datensätzen;800
4.8.6.3;15.6.3 Ein DataSet in einen XML-String serialisieren;802
4.8.6.4;15.6.4 Untypisiertes DataSet in ein typisiertes konvertieren;806
4.9;16 Verteilen von Anwendungen;813
4.9.1;16.1 ClickOnce-Deployment;814
4.9.1.1;16.1.1 Übersicht/Einschränkungen;814
4.9.1.2;16.1.2 Die Vorgehensweise;815
4.9.1.3;16.1.3 Ort der Veröffentlichung;815
4.9.1.4;16.1.4 Anwendungsdateien;816
4.9.1.5;16.1.5 Erforderliche Komponenten;817
4.9.1.6;16.1.6 Aktualisierungen;818
4.9.1.7;16.1.7 Veröffentlichungsoptionen;819
4.9.1.8;16.1.8 Veröffentlichen;820
4.9.1.9;16.1.9 Verzeichnisstruktur;820
4.9.1.10;16.1.10 Der Webpublishing-Assistent;822
4.9.1.11;16.1.11 Neue Versionen erstellen;823
4.9.2;16.2 Setup-Projekte;823
4.9.2.1;16.2.1 Installation;823
4.9.2.2;16.2.2 Ein neues Setup-Projekt;825
4.9.2.3;16.2.3 Dateisystem-Editor;830
4.9.2.4;16.2.4 Registrierungs-Editor;831
4.9.2.5;16.2.5 Dateityp-Editor;832
4.9.2.6;16.2.6 Benutzeroberflächen-Editor;832
4.9.2.7;16.2.7 Editor für benutzerdefinierte Aktionen;833
4.9.2.8;16.2.8 Editor für Startbedingungen;834
4.10;17 Weitere Techniken;835
4.10.1;17.1 Zugriff auf die Zwischenablage;835
4.10.1.1;17.1.1 Das Clipboard-Objekt;835
4.10.1.2;17.1.2 Zwischenablage-Funktionen für Textboxen;837
4.10.2;17.2 Arbeiten mit der Registry;838
4.10.2.1;17.2.1 Allgemeines;838
4.10.2.2;17.2.2 Registry-Unterstützung in .NET;840
4.10.3;17.3 .NET-Reflection;841
4.10.3.1;17.3.1 Übersicht;841
4.10.3.2;17.3.2 Assembly laden;842
4.10.3.3;17.3.3 Mittels GetType und Type Informationen sammeln;842
4.10.3.4;17.3.4 Dynamisches Laden von Assemblies;845
4.10.4;17.4 Praxisbeispiele;848
4.10.4.1;17.4.1 Zugriff auf die Registry;848
4.10.4.2;17.4.2 Dateiverknüpfungen erzeugen;850
4.10.4.3;17.4.3 Betrachter für Manifestressourcen;852
4.10.4.4;17.4.4 Die Zwischenablage überwachen und anzeigen;855
4.10.4.5;17.4.5 Die WIA-Library kennenlernen;858
4.10.4.6;17.4.6 Auf eine Webcam zugreifen;869
4.10.4.7;17.4.7 Auf den Scanner zugreifen;871
4.10.4.8;17.4.8 OpenOffice.org Writer per OLE steuern;877
4.10.4.9;17.4.9 Nutzer und Gruppen des aktuellen Systems ermitteln;884
4.10.4.10;17.4.10 Testen, ob Nutzer in einer Gruppe enthalten ist;886
4.10.4.11;17.4.11 Testen, ob der Nutzer ein Administrator ist;888
4.10.4.12;17.4.12 Die IP-Adressen des Computers bestimmen;889
4.10.4.13;17.4.13 Die IP-Adresse über den Hostnamen bestimmen;890
4.10.4.14;17.4.14 Diverse Systeminformationen ermitteln;891
4.10.4.15;17.4.15 Alles über den Bildschirm erfahren;899
4.10.4.16;17.4.16 Sound per MCI aufnehmen;901
4.10.4.17;17.4.17 Mikrofonpegel anzeigen;904
4.10.4.18;17.4.18 Pegeldiagramm aufzeichnen;906
4.10.4.19;17.4.19 Sound-und Videodateien per MCI abspielen;909
4.11;18 Konsolenanwendungen;919
4.11.1;18.1 Grundaufbau/Konzepte;919
4.11.1.1;18.1.1 Unser Hauptprogramm – Program.cs;920
4.11.1.2;18.1.2 Rückgabe eines Fehlerstatus;921
4.11.1.3;18.1.3 Parameterübergabe;922
4.11.1.4;18.1.4 Zugriff auf die Umgebungsvariablen;924
4.11.2;18.2 Die Kommandozentrale: System.Console;925
4.11.2.1;18.2.1 Eigenschaften;925
4.11.2.2;18.2.2 Methoden/Ereignisse;926
4.11.2.3;18.2.3 Textausgaben;926
4.11.2.4;18.2.4 Farbangaben;927
4.11.2.5;18.2.5 Tastaturabfragen;929
4.11.2.6;18.2.6 Arbeiten mit Streamdaten;930
4.11.3;18.3 Praxisbeispiel;932
4.11.3.1;18.3.1 Farbige Konsolenanwendung;932
4.11.3.2;18.3.2 Weitere Hinweise und Beispiele;934
5;Anhang A: Glossar;935
6;Anhang B: Wichtige Dateiextensions;939
7;Index;941
8;Leere Seite;2