Inhalt | 7 |
Vorwort | 23 |
TEIL I: Grundlagen | 27 |
1 Einstieg in Visual Studio 2017 | 29 |
1.1 Die Installation von Visual Studio 2017 | 29 |
1.1.1 Überblick über die Produktpalette | 29 |
1.1.2 Anforderungen an Hard- und Software | 30 |
1.2 Unser allererstes C#-Programm | 31 |
1.2.1 Vorbereitungen | 31 |
1.2.2 Quellcode schreiben | 33 |
1.2.3 Programm kompilieren und testen | 33 |
1.2.4 Einige Erläuterungen zum Quellcode | 34 |
1.2.5 Konsolenanwendungen sind out | 35 |
1.3 Die Windows-Philosophie | 36 |
1.3.1 Mensch-Rechner-Dialog | 36 |
1.3.2 Objekt- und ereignisorientierte Programmierung | 36 |
1.3.3 Programmieren mit Visual Studio 2017 | 38 |
1.4 Die Entwicklungsumgebung Visual Studio 2017 | 39 |
1.4.1 Neues Projekt | 39 |
1.4.2 Die wichtigsten Fenster | 40 |
1.5 Microsofts .NET-Technologie | 44 |
1.5.1 Zur Geschichte von .NET | 44 |
1.5.2 .NET-Features und Begriffe | 46 |
1.6 Praxisbeispiele | 54 |
1.6.1 Unsere erste Windows-Forms-Anwendung | 54 |
1.6.2 Umrechnung Euro-Dollar | 58 |
2 Grundlagen der Sprache C# | 67 |
2.1 Grundbegriffe | 67 |
2.1.1 Anweisungen | 67 |
2.1.2 Bezeichner | 68 |
2.1.3 Schlüsselwörter | 69 |
2.1.4 Kommentare | 70 |
2.2 Datentypen, Variablen und Konstanten | 71 |
2.2.1 Fundamentale Typen | 71 |
2.2.2 Wertetypen versus Verweistypen | 72 |
2.2.3 Benennung von Variablen | 73 |
2.2.4 Deklaration von Variablen | 73 |
2.2.5 Typsuffixe | 75 |
2.2.6 Zeichen und Zeichenketten | 75 |
2.2.7 object-Datentyp | 78 |
2.2.8 Konstanten deklarieren | 79 |
2.2.9 Nullable Types | 79 |
2.2.10 Typinferenz | 80 |
2.2.11 Gültigkeitsbereiche und Sichtbarkeit | 81 |
2.3 Konvertieren von Datentypen | 82 |
2.3.1 Implizite und explizite Konvertierung | 82 |
2.3.2 Welcher Datentyp passt zu welchem? | 84 |
2.3.3 Konvertieren von string | 84 |
2.3.4 Die Convert-Klasse | 87 |
2.3.5 Die Parse-Methode | 87 |
2.3.6 Boxing und Unboxing | 88 |
2.4 Operatoren | 89 |
2.4.1 Arithmetische Operatoren | 90 |
2.4.2 Zuweisungsoperatoren | 92 |
2.4.3 Logische Operatoren | 93 |
2.4.4 Rangfolge der Operatoren | 95 |
2.5 Kontrollstrukturen | 97 |
2.5.1 Verzweigungsbefehle | 97 |
2.5.2 Schleifenanweisungen | 100 |
2.6 Benutzerdefinierte Datentypen | 103 |
2.6.1 Enumerationen | 103 |
2.6.2 Strukturen | 105 |
2.7 Nutzerdefinierte Methoden | 107 |
2.7.1 Methoden mit Rückgabewert | 108 |
2.7.2 Methoden ohne Rückgabewert | 109 |
2.7.3 Parameterübergabe mit ref | 110 |
2.7.4 Parameterübergabe mit out | 111 |
2.7.5 Methodenüberladung | 112 |
2.7.6 Optionale Parameter | 113 |
2.7.7 Benannte Parameter | 115 |
2.8 Praxisbeispiele | 116 |
2.8.1 Vom PAP zur Konsolenanwendung | 116 |
2.8.2 Ein Konsolen- in ein Windows-Programm verwandeln | 118 |
2.8.3 Schleifenanweisungen verstehen | 120 |
2.8.4 Benutzerdefinierte Methoden überladen | 122 |
2.8.5 Anwendungen von Visual Basic nach C# portieren | 125 |
3 OOP-Konzepte | 133 |
3.1 Kleine Einführung in die OOP | 133 |
3.1.1 Historische Entwicklung | 134 |
3.1.2 Grundbegriffe der OOP | 135 |
3.1.3 Sichtbarkeit von Klassen und ihren Mitgliedern | 137 |
3.1.4 Allgemeiner Aufbau einer Klasse | 138 |
3.1.5 Das Erzeugen eines Objekts | 140 |
3.1.6 Einführungsbeispiel | 143 |
3.2 Eigenschaften | 147 |
3.2.1 Eigenschaften mit Zugriffsmethoden kapseln | 147 |
3.2.2 Berechnete Eigenschaften | 149 |
3.2.3 Lese-/Schreibschutz | 151 |
3.2.4 Property-Accessoren | 152 |
3.2.5 Statische Felder/Eigenschaften | 152 |
3.2.6 Einfache Eigenschaften automatisch implementieren | 155 |
3.3 Methoden | 156 |
3.3.1 Öffentliche und private Methoden | 156 |
3.3.2 Überladene Methoden | 157 |
3.3.3 Statische Methoden | 158 |
3.4 Ereignisse | 160 |
3.4.1 Ereignis hinzufügen | 160 |
3.4.2 Ereignis verwenden | 163 |
3.5 Arbeiten mit Konstruktor und Destruktor | 166 |
3.5.1 Konstruktor und Objektinitialisierer | 167 |
3.5.2 Destruktor und Garbage Collector | 170 |
3.5.3 Mit using den Lebenszyklus des Objekts kapseln | 172 |
3.5.4 Verzögerte Initialisierung | 173 |
3.6 Vererbung und Polymorphie | 174 |
3.6.1 Klassendiagramm | 174 |
3.6.2 Method-Overriding | 175 |
3.6.3 Klassen implementieren | 175 |
3.6.4 Implementieren der Objekte | 179 |
3.6.5 Ausblenden von Mitgliedern durch Vererbung | 180 |
3.6.6 Allgemeine Hinweise und Regeln zur Vererbung | 182 |
3.6.7 Polymorphes Verhalten | 183 |
3.6.8 Die Rolle von System.Object | 186 |
3.7 Spezielle Klassen | 187 |
3.7.1 Abstrakte Klassen | 187 |
3.7.2 Versiegelte Klassen | 189 |
3.7.3 Partielle Klassen | 189 |
3.7.4 Statische Klassen | 191 |
3.8 Schnittstellen (Interfaces) | 191 |
3.8.1 Definition einer Schnittstelle | 192 |
3.8.2 Implementieren einer Schnittstelle | 192 |
3.8.3 Abfragen, ob Schnittstelle vorhanden ist | 193 |
3.8.4 Mehrere Schnittstellen implementieren | 194 |
3.8.5 Schnittstellenprogrammierung ist ein weites Feld ... | 194 |
3.9 Praxisbeispiele | 195 |
3.9.1 Eigenschaften sinnvoll kapseln | 195 |
3.9.2 Eine statische Klasse anwenden | 198 |
3.9.3 Vom fetten zum schlanken Client | 200 |
3.9.4 Schnittstellenvererbung verstehen | 210 |
3.9.5 Rechner für komplexe Zahlen | 215 |
3.9.6 Sortieren mit IComparable/IComparer | 224 |
3.9.7 Einen Objektbaum in generischen Listen abspeichern | 228 |
3.9.8 OOP beim Kartenspiel erlernen | 234 |
3.9.9 Eine Klasse zur Matrizenrechnung entwickeln | 239 |
4 Arrays, Strings, Funktionen | 245 |
4.1 Datenfelder (Arrays) | 245 |
4.1.1 Array deklarieren | 246 |
4.1.2 Array instanziieren | 246 |
4.1.3 Array initialisieren | 247 |
4.1.4 Zugriff auf Array-Elemente | 248 |
4.1.5 Zugriff mittels Schleife | 249 |
4.1.6 Mehrdimensionale Arrays | 250 |
4.1.7 Zuweisen von Arrays | 252 |
4.1.8 Arrays aus Strukturvariablen | 253 |
4.1.9 Löschen und Umdimensionieren von Arrays | 254 |
4.1.10 Eigenschaften und Methoden von Arrays | 255 |
4.1.11 Übergabe von Arrays | 257 |
4.2 Verarbeiten von Zeichenketten | 258 |
4.2.1 Zuweisen von Strings | 258 |
4.2.2 Eigenschaften und Methoden von String-Variablen | 259 |
4.2.3 Wichtige Methoden der String-Klasse | 262 |
4.2.4 Die StringBuilder-Klasse | 264 |
4.3 Reguläre Ausdrücke | 267 |
4.3.1 Wozu werden reguläre Ausdrücke verwendet? | 267 |
4.3.2 Eine kleine Einführung | 267 |
4.3.3 Wichtige Methoden/Eigenschaften der Klasse Regex | 268 |
4.3.4 Kompilierte reguläre Ausdrücke | 270 |
4.3.5 RegexOptions-Enumeration | 271 |
4.3.6 Metazeichen (Escape-Zeichen) | 272 |
4.3.7 Zeichenmengen (Character Sets) | 273 |
4.3.8 Quantifizierer | 275 |
4.3.9 Zero-Width Assertions | 276 |
4.3.10 Gruppen | 280 |
4.3.11 Text ersetzen | 280 |
4.3.12 Text splitten | 281 |
4.4 Datums- und Zeitberechnungen | 282 |
4.4.1 Die DateTime-Struktur | 282 |
4.4.2 Wichtige Eigenschaften von DateTime-Variablen | 284 |
4.4.3 Wichtige Methoden von DateTime-Variablen | 284 |
4.4.4 Wichtige Mitglieder der DateTime-Struktur | 285 |
4.4.5 Konvertieren von Datumstrings in DateTime-Werte | 286 |
4.4.6 Die TimeSpan-Struktur | 287 |
4.5 Mathematische Funktionen | 289 |
4.5.1 Überblick | 289 |
4.5.2 Zahlen runden | 289 |
4.5.3 Winkel umrechnen | 290 |
4.5.4 Potenz- und Wurzeloperationen | 290 |
4.5.5 Logarithmus und Exponentialfunktionen | 290 |
4.5.6 Zufallszahlen erzeugen | 291 |
4.6 Zahlen- und Datumsformatierungen | 292 |
4.6.1 Anwenden der ToString-Methode | 292 |
4.6.2 Anwenden der Format-Methode | 294 |
4.6.3 Stringinterpolation | 295 |
4.7 Praxisbeispiele | 296 |
4.7.1 Zeichenketten verarbeiten | 296 |
4.7.2 Zeichenketten mit StringBuilder addieren | 299 |
4.7.3 Reguläre Ausdrücke testen | 303 |
4.7.4 Methodenaufrufe mit Array-Parametern | 304 |
5 Weitere Sprachfeatures | 309 |
5.1 Namespaces (Namensräume) | 309 |
5.1.1 Ein kleiner Überblick | 309 |
5.1.2 Einen eigenen Namespace einrichten | 310 |
5.1.3 Die using-Anweisung | 311 |
5.1.4 Namespace Alias | 312 |
5.2 Operatorenüberladung | 313 |
5.2.1 Syntaxregeln | 313 |
5.2.2 Praktische Anwendung | 313 |
5.3 Collections (Auflistungen) | 314 |
5.3.1 Die Schnittstelle IEnumerable | 315 |
5.3.2 ArrayList | 317 |
5.3.3 Hashtable | 319 |
5.3.4 Indexer | 319 |
5.4 Generics | 322 |
5.4.1 Klassische Vorgehensweise | 322 |
5.4.2 Generics bieten Typsicherheit | 324 |
5.4.3 Generische Methoden | 325 |
5.4.4 Iteratoren | 326 |
5.5 Generische Collections | 327 |
5.5.1 List-Collection statt ArrayList | 327 |
5.5.2 Vorteile generischer Collections | 328 |
5.5.3 Constraints | 328 |
5.6 Das Prinzip der Delegates | 329 |
5.6.1 Delegates sind Methodenzeiger | 329 |
5.6.2 Einen Delegate-Typ deklarieren | 329 |
5.6.3 Ein Delegate-Objekt erzeugen | 330 |
5.6.4 Delegates vereinfacht instanziieren | 332 |
5.6.5 Anonyme Methoden | 332 |
5.6.6 Lambda-Ausdrücke | 334 |
5.6.7 Lambda-Ausdrücke in der Task Parallel Library | 336 |
5.7 Dynamische Programmierung | 338 |
5.7.1 Wozu dynamische Programmierung? | 338 |
5.7.2 Das Prinzip der dynamischen Programmierung | 338 |
5.7.3 Optionale Parameter sind hilfreich | 341 |
5.7.4 Kovarianz und Kontravarianz | 342 |
5.8 Weitere Datentypen | 343 |
5.8.1 BigInteger | 343 |
5.8.2 Complex | 345 |
5.8.3 Tuple<> | 346 |
5.8.4 SortedSet<> | 347 |
5.9 Praxisbeispiele | 348 |
5.9.1 ArrayList versus generische List | 348 |
5.9.2 Generische IEnumerable-Interfaces implementieren | 351 |
5.9.3 Delegates, anonyme Methoden, Lambda Expressions | 355 |
5.9.4 Dynamischer Zugriff auf COM Interop | 359 |
6 Einführung in LINQ | 363 |
6.1 LINQ-Grundlagen | 363 |
6.1.1 Die LINQ-Architektur | 363 |
6.1.2 Anonyme Typen | 365 |
6.1.3 Erweiterungsmethoden | 366 |
6.2 Abfragen mit LINQ to Objects | 367 |
6.2.1 Grundlegendes zur LINQ-Syntax | 368 |
6.2.2 Zwei alternative Schreibweisen von LINQ-Abfragen | 369 |
6.2.3 Übersicht der wichtigsten Abfrageoperatoren | 370 |
6.3 LINQ-Abfragen im Detail | 371 |
6.3.1 Die Projektionsoperatoren Select und SelectMany | 372 |
6.3.2 Der Restriktionsoperator Where | 374 |
6.3.3 Die Sortierungsoperatoren OrderBy und ThenBy | 374 |
6.3.4 Der Gruppierungsoperator GroupBy | 376 |
6.3.5 Verknüpfen mit Join | 378 |
6.3.6 Aggregat-Operatoren | 379 |
6.3.7 Verzögertes Ausführen von LINQ-Abfragen | 381 |
6.3.8 Konvertierungsmethoden | 382 |
6.3.9 Abfragen mit PLINQ | 383 |
6.4 Praxisbeispiele | 386 |
6.4.1 Die Syntax von LINQ-Abfragen verstehen | 386 |
6.4.2 Aggregat-Abfragen mit LINQ | 389 |
6.4.3 LINQ im Schnelldurchgang erlernen | 391 |
6.4.4 Strings mit LINQ abfragen und filtern | 394 |
6.4.5 Duplikate aus einer Liste oder einem Array entfernen | 395 |
6.4.6 Arrays mit LINQ initialisieren | 398 |
6.4.7 Arrays per LINQ mit Zufallszahlen füllen | 400 |
6.4.8 Einen String mit Wiederholmuster erzeugen | 402 |
6.4.9 Mit LINQ Zahlen und Strings sortieren | 403 |
6.4.10 Mit LINQ Collections von Objekten sortieren | 404 |
6.4.11 Ergebnisse von LINQ-Abfragen in ein Array kopieren | 407 |
7 C#-Sprachneuerungen im Überblick | 409 |
7.1 C# 4.0 – Visual Studio 2010 | 409 |
7.1.1 Datentyp dynamic | 409 |
7.1.2 Benannte und optionale Parameter | 410 |
7.1.3 Covarianz und Contravarianz | 412 |
7.2 C# 5.0 – Visual Studio 2012 | 412 |
7.2.1 Async und Await | 412 |
7.2.2 CallerInfo | 412 |
7.3 Visual Studio 2013 | 413 |
7.4 C# 6.0 – Visual Studio 2015 | 413 |
7.4.1 String Interpolation | 413 |
7.4.2 Schreibgeschützte AutoProperties | 413 |
7.4.3 Initialisierer für AutoProperties | 414 |
7.4.4 Expression Body Funktionsmember | 414 |
7.4.5 using static | 414 |
7.4.6 Bedingter Nulloperator | 415 |
7.4.7 Ausnahmenfilter | 415 |
7.4.8 nameof-Ausdrücke | 416 |
7.4.9 await in catch und finally | 416 |
7.4.10 Indexinitialisierer | 416 |
7.5 C# 7.0 – Visual Studio 2017 | 417 |
7.5.1 out-Variablen | 417 |
7.5.2 Tupel | 417 |
7.5.3 Mustervergleich | 418 |
7.5.4 Discards | 420 |
7.5.5 Lokale ref-Variablen und Rückgabetypen | 420 |
7.5.6 Lokale Funktionen | 420 |
7.5.7 Mehr Expression-Bodied Member | 420 |
7.5.8 throw-Ausdrücke | 421 |
7.5.9 Verbesserung der numerischen literalen Syntax | 421 |
Teil II: Technologien | 423 |
8 Zugriff auf das Dateisystem | 425 |
8.1 Grundlagen | 425 |
8.1.1 Klassen für den Zugriff auf das Dateisystem | 426 |
8.1.2 Statische versus Instanzen-Klasse | 426 |
8.2 Übersichten | 427 |
8.2.1 Methoden der Directory-Klasse | 428 |
8.2.2 Methoden eines DirectoryInfo-Objekts | 428 |
8.2.3 Eigenschaften eines DirectoryInfo-Objekts | 428 |
8.2.4 Methoden der File-Klasse | 429 |
8.2.5 Methoden eines FileInfo-Objekts | 430 |
8.2.6 Eigenschaften eines FileInfo-Objekts | 430 |
8.3 Operationen auf Verzeichnisebene | 431 |
8.3.1 Existenz eines Verzeichnisses/einer Datei feststellen | 431 |
8.3.2 Verzeichnisse erzeugen und löschen | 431 |
8.3.3 Verzeichnisse verschieben und umbenennen | 432 |
8.3.4 Aktuelles Verzeichnis bestimmen | 432 |
8.3.5 Unterverzeichnisse ermitteln | 433 |
8.3.6 Alle Laufwerke ermitteln | 433 |
8.3.7 Dateien kopieren und verschieben | 434 |
8.3.8 Dateien umbenennen | 435 |
8.3.9 Dateiattribute feststellen | 435 |
8.3.10 Verzeichnis einer Datei ermitteln | 437 |
8.3.11 Alle im Verzeichnis enthaltenen Dateien ermitteln | 437 |
8.3.12 Dateien und Unterverzeichnisse ermitteln | 438 |
8.4 Zugriffsberechtigungen | 439 |
8.4.1 ACL und ACE | 439 |
8.4.2 SetAccessControl-Methode | 439 |
8.4.3 Zugriffsrechte anzeigen | 440 |
8.5 Weitere wichtige Klassen | 441 |
8.5.1 Die Path-Klasse | 441 |
8.5.2 Die Klasse FileSystemWatcher | 442 |
8.5.3 Die Klasse ZipArchive | 443 |
8.6 Datei- und Verzeichnisdialoge | 445 |
8.6.1 OpenFileDialog und SaveFileDialog | 445 |
8.6.2 FolderBrowserDialog | 447 |
8.7 Praxisbeispiele | 448 |
8.7.1 Infos über Verzeichnisse und Dateien gewinnen | 448 |
8.7.2 Eine Verzeichnisstruktur in die TreeView einlesen | 451 |
8.7.3 Mit LINQ und RegEx Verzeichnisbäume durchsuchen | 454 |
9 Dateien lesen und schreiben | 459 |
9.1 Grundprinzip der Datenpersistenz | 459 |
9.1.1 Dateien und Streams | 459 |
9.1.2 Die wichtigsten Klassen | 460 |
9.1.3 Erzeugen eines Streams | 461 |
9.2 Dateiparameter | 461 |
9.2.1 FileAccess | 461 |
9.2.2 FileMode | 462 |
9.2.3 FileShare | 462 |
9.3 Textdateien | 463 |
9.3.1 Eine Textdatei beschreiben bzw. neu anlegen | 463 |
9.3.2 Eine Textdatei lesen | 464 |
9.4 Binärdateien | 466 |
9.4.1 Lese-/Schreibzugriff | 466 |
9.4.2 Die Methoden ReadAllBytes und WriteAllBytes | 467 |
9.4.3 Erzeugen von BinaryReader/BinaryWriter | 467 |
9.5 Sequenzielle Dateien | 468 |
9.5.1 Lesen und Schreiben von strukturierten Daten | 468 |
9.5.2 Serialisieren von Objekten | 469 |
9.6 Dateien verschlüsseln und komprimieren | 470 |
9.6.1 Das Methodenpärchen Encrypt/Decrypt | 470 |
9.6.2 Verschlüsseln unter Windows Vista/7/8/10 | 471 |
9.6.3 Verschlüsseln mit der CryptoStream-Klasse | 472 |
9.6.4 Dateien komprimieren | 473 |
9.7 Memory Mapped Files | 474 |
9.7.1 Grundprinzip | 474 |
9.7.2 Erzeugen eines MMF | 475 |
9.7.3 Erstellen eines Map View | 475 |
9.8 Praxisbeispiele | 476 |
9.8.1 Auf eine Textdatei zugreifen | 476 |
9.8.2 Einen Objektbaum persistent speichern | 480 |
9.8.3 Ein Memory Mapped File (MMF) verwenden | 487 |
9.8.4 Hex-Dezimal-Bytes-Konverter | 489 |
9.8.5 Eine Datei verschlüsseln | 493 |
9.8.6 Eine Datei komprimieren | 496 |
9.8.7 PDFs erstellen/exportieren | 498 |
9.8.8 Eine CSV-Datei erstellen | 501 |
9.8.9 Eine CSV-Datei mit LINQ lesen und auswerten | 504 |
9.8.10 Einen korrekten Dateinamen erzeugen | 506 |
10 Asynchrone Programmierung | 507 |
10.1 Übersicht | 507 |
10.1.1 Multitasking versus Multithreading | 508 |
10.1.2 Deadlocks | 509 |
10.1.3 Racing | 510 |
10.2 Programmieren mit Threads | 511 |
10.2.1 Einführungsbeispiel | 512 |
10.2.2 Wichtige Thread-Methoden | 513 |
10.2.3 Wichtige Thread-Eigenschaften | 515 |
10.2.4 Einsatz der ThreadPool-Klasse | 516 |
10.3 Sperrmechanismen | 518 |
10.3.1 Threading ohne lock | 518 |
10.3.2 Threading mit lock | 520 |
10.3.3 Die Monitor-Klasse | 522 |
10.3.4 Mutex | 526 |
10.3.5 Methoden für die parallele Ausführung sperren | 527 |
10.3.6 Semaphore | 528 |
10.4 Interaktion mit der Programmoberfläche | 529 |
10.4.1 Die Werkzeuge | 530 |
10.4.2 Einzelne Steuerelemente mit Invoke aktualisieren | 530 |
10.4.3 Mehrere Steuerelemente aktualisieren | 532 |
10.4.4 Ist ein Invoke-Aufruf nötig? | 532 |
10.4.5 Und was ist mit WPF? | 533 |
10.5 Timer-Threads | 535 |
10.6 Die BackgroundWorker-Komponente | 536 |
10.7 Asynchrone Programmierentwurfsmuster | 538 |
10.7.1 Kurzübersicht | 539 |
10.7.2 Polling | 540 |
10.7.3 Callback verwenden | 542 |
10.7.4 Callback mit Parameterübergabe verwenden | 542 |
10.7.5 Callback mit Zugriff auf die Programmoberfläche | 544 |
10.8 Asynchroner Aufruf beliebiger Methoden | 545 |
10.8.1 Die Beispielklasse | 545 |
10.8.2 Asynchroner Aufruf ohne Callback | 546 |
10.8.3 Asynchroner Aufruf mit Callback und Anzeigefunktion | 547 |
10.8.4 Aufruf mit Rückgabewerten (per Eigenschaft) | 548 |
10.8.5 Aufruf mit Rückgabewerten (per EndInvoke) | 549 |
10.9 Es geht auch einfacher – async und await | 550 |
10.9.1 Der Weg von synchron zu asynchron | 550 |
10.9.2 Achtung: Fehlerquellen! | 552 |
10.9.3 Eigene asynchrone Methoden entwickeln | 554 |
10.10 Praxisbeispiele | 557 |
10.10.1 Spieltrieb & Multithreading erleben | 557 |
10.10.2 Prozess- und Thread-Informationen gewinnen | 570 |
10.10.3 Ein externes Programm starten | 575 |
11 Die Task Parallel Library | 579 |
11.1 Überblick | 579 |
11.1.1 Parallel-Programmierung | 579 |
11.1.2 Möglichkeiten der TPL | 582 |
11.1.3 Der CLR-Threadpool | 582 |
11.2 Parallele Verarbeitung mit Parallel.Invoke | 583 |
11.2.1 Aufrufvarianten | 584 |
11.2.2 Einschränkungen | 585 |
11.3 Verwendung von Parallel.For | 585 |
11.3.1 Abbrechen der Verarbeitung | 587 |
11.3.2 Auswerten des Verarbeitungsstatus | 588 |
11.3.3 Und was ist mit anderen Iterator-Schrittweiten? | 589 |
11.4 Collections mit Parallel.ForEach verarbeiten | 590 |
11.5 Die Task-Klasse | 591 |
11.5.1 Einen Task erzeugen | 591 |
11.5.2 Den Task starten | 592 |
11.5.3 Datenübergabe an den Task | 594 |
11.5.4 Wie warte ich auf das Ende des Task? | 595 |
11.5.5 Tasks mit Rückgabewerten | 597 |
11.5.6 Die Verarbeitung abbrechen | 600 |
11.5.7 Fehlerbehandlung | 604 |
11.5.8 Weitere Eigenschaften | 605 |
11.6 Zugriff auf das User-Interface | 606 |
11.6.1 Task-Ende und Zugriff auf die Oberfläche | 606 |
11.6.2 Zugriff auf das UI aus dem Task heraus | 608 |
11.7 Weitere Datenstrukturen im Überblick | 610 |
11.7.1 Threadsichere Collections | 610 |
11.7.2 Primitive für die Threadsynchronisation | 611 |
11.8 Parallel LINQ (PLINQ) | 611 |
11.9 Praxisbeispiel: Spieltrieb – Version 2 | 611 |
11.9.1 Aufgabenstellung | 612 |
11.9.2 Global-Klasse | 612 |
11.9.3 Controller-Klasse | 613 |
11.9.4 LKW-Klasse | 615 |
11.9.5 Schiff-Klasse | 616 |
11.9.6 Oberfläche | 619 |
12 Fehlersuche und Behandlung | 621 |
12.1 Der Debugger | 621 |
12.1.1 Allgemeine Beschreibung | 621 |
12.1.2 Die wichtigsten Fenster | 622 |
12.1.3 Debugging-Optionen | 625 |
12.1.4 Praktisches Debugging am Beispiel | 628 |
12.2 Arbeiten mit Debug und Trace | 632 |
12.2.1 Wichtige Methoden von Debug und Trace | 632 |
12.2.2 Besonderheiten der Trace-Klasse | 636 |
12.2.3 TraceListener-Objekte | 637 |
12.3 Caller Information | 639 |
12.3.1 Attribute | 639 |
12.3.2 Anwendung | 640 |
12.4 Fehlerbehandlung | 641 |
12.4.1 Anweisungen zur Fehlerbehandlung | 641 |
12.4.2 try-catch | 641 |
12.4.3 try-finally | 646 |
12.4.4 Das Standardverhalten bei Ausnahmen festlegen | 649 |
12.4.5 Die Exception-Klasse | 650 |
12.4.6 Fehler/Ausnahmen auslösen | 651 |
12.4.7 Eigene Fehlerklassen | 651 |
12.4.8 Exceptionhandling zur Entwurfszeit | 653 |
12.4.9 Code Contracts | 654 |
13 XML in Theorie und Praxis | 655 |
13.1 XML – etwas Theorie | 655 |
13.1.1 Übersicht | 655 |
13.1.2 Der XML-Grundaufbau | 658 |
13.1.3 Wohlgeformte Dokumente | 659 |
13.1.4 Processing Instructions (PI) | 661 |
13.1.5 Elemente und Attribute | 662 |
13.1.6 Verwendbare Zeichensätze | 663 |
13.2 XSD-Schemas | 666 |
13.2.1 XSD-Schemas und ADO.NET | 666 |
13.2.2 XML-Schemas in Visual Studio analysieren | 668 |
13.2.3 XML-Datei mit XSD-Schema erzeugen | 672 |
13.2.4 XSD-Schema aus einer XML-Datei erzeugen | 673 |
13.3 Verwendung des DOM unter .NET | 673 |
13.3.1 Übersicht | 673 |
13.3.2 DOM-Integration in C# | 675 |
13.3.3 Laden von Dokumenten | 675 |
13.3.4 Erzeugen von XML-Dokumenten | 676 |
13.3.5 Auslesen von XML-Dateien | 678 |
13.3.6 Direktzugriff auf einzelne Elemente | 679 |
13.3.7 Einfügen von Informationen | 680 |
13.3.8 Suchen in den Baumzweigen | 683 |
13.4 XML-Verarbeitung mit LINQ to XML | 686 |
13.4.1 Die LINQ to XML-API | 686 |
13.4.2 Neue XML-Dokumente erzeugen | 688 |
13.4.3 Laden und Sichern von XML-Dokumenten | 690 |
13.4.4 Navigieren in XML-Daten | 691 |
13.4.5 Auswählen und Filtern | 693 |
13.4.6 Manipulieren der XML-Daten | 694 |
13.4.7 XML-Dokumente transformieren | 695 |
13.5 Weitere Möglichkeiten der XML-Verarbeitung | 698 |
13.5.1 XML-Daten aus Objektstrukturen erzeugen | 698 |
13.5.2 Schnelles Suchen in XML-Daten mit XPathNavigator | 702 |
13.5.3 Schnelles Auslesen von XML-Daten mit XmlReader | 704 |
13.5.4 Erzeugen von XML-Daten mit XmlWriter | 706 |
13.5.5 XML transformieren mit XSLT | 708 |
13.6 JSON – JavaScriptObjectNotation | 710 |
13.6.1 Grundlagen | 710 |
13.6.2 De-/Serialisierung mit JSON | 710 |
13.7 Praxisbeispiele | 713 |
13.7.1 Mit dem DOM in XML-Dokumenten navigieren | 713 |
13.7.2 XML-Daten in eine TreeView einlesen | 717 |
13.7.3 In Dokumenten mit dem XPathNavigator navigieren | 721 |
14 Einführung in ADO.NET und Entity Framework | 727 |
14.1 Eine kleine Übersicht | 727 |
14.1.1 Die ADO.NET-Klassenhierarchie | 727 |
14.1.2 Die Klassen der Datenprovider | 729 |
14.1.3 Das Zusammenspiel der ADO.NET-Klassen | 731 |
14.2 Das Connection-Objekt | 732 |
14.2.1 Allgemeiner Aufbau | 732 |
14.2.2 SqlConnection | 732 |
14.2.3 Schließen einer Verbindung | 733 |
14.2.4 Eigenschaften des Connection-Objekts | 734 |
14.2.5 Methoden des Connection-Objekts | 736 |
14.2.6 Der ConnectionStringBuilder | 737 |
14.3 Das Command-Objekt | 737 |
14.3.1 Erzeugen und Anwenden eines Command-Objekts | 738 |
14.3.2 Erzeugen mittels CreateCommand-Methode | 739 |
14.3.3 Eigenschaften des Command-Objekts | 739 |
14.3.4 Methoden des Command-Objekts | 741 |
14.3.5 Freigabe von Connection- und Command-Objekten | 743 |
14.4 Parameter-Objekte | 744 |
14.4.1 Erzeugen und Anwenden eines Parameter-Objekts | 744 |
14.4.2 Eigenschaften des Parameter-Objekts | 745 |
14.5 Das CommandBuilder-Objekt | 746 |
14.5.1 Erzeugen | 746 |
14.5.2 Anwenden | 746 |
14.6 Das DataReader-Objekt | 747 |
14.6.1 DataReader erzeugen | 747 |
14.6.2 Daten lesen | 748 |
14.6.3 Eigenschaften des DataReaders | 749 |
14.6.4 Methoden des DataReaders | 749 |
14.7 Das DataAdapter-Objekt | 750 |
14.7.1 DataAdapter erzeugen | 750 |
14.7.2 Command-Eigenschaften | 751 |
14.7.3 Fill-Methode | 752 |
14.7.4 Update-Methode | 753 |
14.8 Entity Framework | 754 |
14.8.1 Überblick | 754 |
14.8.2 DatabaseFirst | 756 |
14.8.3 CodeFirst | 764 |
14.9 Praxisbeispiele | 769 |
14.9.1 Wichtige ADO.NET-Objekte im Einsatz | 769 |
14.9.2 Eine Aktionsabfrage ausführen | 771 |
14.9.3 Eine StoredProcedure aufrufen | 773 |
14.9.4 Die Datenbank aktualisieren | 776 |
15 Das DataSet | 781 |
15.1 Grundlegende Features des DataSets | 781 |
15.1.1 Die Objekthierarchie | 782 |
15.1.2 Die wichtigsten Klassen | 782 |
15.1.3 Erzeugen eines DataSets | 783 |
15.2 Das DataTable-Objekt | 785 |
15.2.1 DataTable erzeugen | 785 |
15.2.2 Spalten hinzufügen | 785 |
15.2.3 Zeilen zur DataTable hinzufügen | 786 |
15.2.4 Auf den Inhalt einer DataTable zugreifen | 787 |
15.3 Die DataView | 789 |
15.3.1 Erzeugen einer DataView | 790 |
15.3.2 Sortieren und Filtern von Datensätzen | 790 |
15.3.3 Suchen von Datensätzen | 791 |
15.4 Typisierte DataSets | 791 |
15.4.1 Ein typisiertes DataSet erzeugen | 792 |
15.4.2 Das Konzept der Datenquellen | 793 |
15.4.3 Typisierte DataSets und TableAdapter | 794 |
15.5 Die Qual der Wahl | 795 |
15.5.1 DataReader – der schnelle Lesezugriff | 796 |
15.5.2 DataSet – die Datenbank im Hauptspeicher | 796 |
15.5.3 Objektrelationales Mapping – die Zukunft? | 797 |
15.6 Praxisbeispiele | 798 |
15.6.1 In der DataView sortieren und filtern | 798 |
15.6.2 Suche nach Datensätzen | 800 |
15.6.3 Ein DataSet in einen XML-String serialisieren | 802 |
15.6.4 Untypisiertes DataSet in ein typisiertes konvertieren | 806 |
16 Verteilen von Anwendungen | 813 |
16.1 ClickOnce-Deployment | 814 |
16.1.1 Übersicht/Einschränkungen | 814 |
16.1.2 Die Vorgehensweise | 815 |
16.1.3 Ort der Veröffentlichung | 815 |
16.1.4 Anwendungsdateien | 816 |
16.1.5 Erforderliche Komponenten | 817 |
16.1.6 Aktualisierungen | 818 |
16.1.7 Veröffentlichungsoptionen | 819 |
16.1.8 Veröffentlichen | 820 |
16.1.9 Verzeichnisstruktur | 820 |
16.1.10 Der Webpublishing-Assistent | 822 |
16.1.11 Neue Versionen erstellen | 823 |
16.2 Setup-Projekte | 823 |
16.2.1 Installation | 823 |
16.2.2 Ein neues Setup-Projekt | 825 |
16.2.3 Dateisystem-Editor | 830 |
16.2.4 Registrierungs-Editor | 831 |
16.2.5 Dateityp-Editor | 832 |
16.2.6 Benutzeroberflächen-Editor | 832 |
16.2.7 Editor für benutzerdefinierte Aktionen | 833 |
16.2.8 Editor für Startbedingungen | 834 |
17 Weitere Techniken | 835 |
17.1 Zugriff auf die Zwischenablage | 835 |
17.1.1 Das Clipboard-Objekt | 835 |
17.1.2 Zwischenablage-Funktionen für Textboxen | 837 |
17.2 Arbeiten mit der Registry | 838 |
17.2.1 Allgemeines | 838 |
17.2.2 Registry-Unterstützung in .NET | 840 |
17.3 .NET-Reflection | 841 |
17.3.1 Übersicht | 841 |
17.3.2 Assembly laden | 842 |
17.3.3 Mittels GetType und Type Informationen sammeln | 842 |
17.3.4 Dynamisches Laden von Assemblies | 845 |
17.4 Praxisbeispiele | 848 |
17.4.1 Zugriff auf die Registry | 848 |
17.4.2 Dateiverknüpfungen erzeugen | 850 |
17.4.3 Betrachter für Manifestressourcen | 852 |
17.4.4 Die Zwischenablage überwachen und anzeigen | 855 |
17.4.5 Die WIA-Library kennenlernen | 858 |
17.4.6 Auf eine Webcam zugreifen | 869 |
17.4.7 Auf den Scanner zugreifen | 871 |
17.4.8 OpenOffice.org Writer per OLE steuern | 877 |
17.4.9 Nutzer und Gruppen des aktuellen Systems ermitteln | 884 |
17.4.10 Testen, ob Nutzer in einer Gruppe enthalten ist | 886 |
17.4.11 Testen, ob der Nutzer ein Administrator ist | 888 |
17.4.12 Die IP-Adressen des Computers bestimmen | 889 |
17.4.13 Die IP-Adresse über den Hostnamen bestimmen | 890 |
17.4.14 Diverse Systeminformationen ermitteln | 891 |
17.4.15 Alles über den Bildschirm erfahren | 899 |
17.4.16 Sound per MCI aufnehmen | 901 |
17.4.17 Mikrofonpegel anzeigen | 904 |
17.4.18 Pegeldiagramm aufzeichnen | 906 |
17.4.19 Sound-und Videodateien per MCI abspielen | 909 |
18 Konsolenanwendungen | 919 |
18.1 Grundaufbau/Konzepte | 919 |
18.1.1 Unser Hauptprogramm – Program.cs | 920 |
18.1.2 Rückgabe eines Fehlerstatus | 921 |
18.1.3 Parameterübergabe | 922 |
18.1.4 Zugriff auf die Umgebungsvariablen | 924 |
18.2 Die Kommandozentrale: System.Console | 925 |
18.2.1 Eigenschaften | 925 |
18.2.2 Methoden/Ereignisse | 926 |
18.2.3 Textausgaben | 926 |
18.2.4 Farbangaben | 927 |
18.2.5 Tastaturabfragen | 929 |
18.2.6 Arbeiten mit Streamdaten | 930 |
18.3 Praxisbeispiel | 932 |
18.3.1 Farbige Konsolenanwendung | 932 |
18.3.2 Weitere Hinweise und Beispiele | 934 |
Anhang A: Glossar | 935 |
Anhang B: Wichtige Dateiextensions | 939 |
Index | 941 |
Leere Seite | 2 |