Inhaltsverzeichnis | 6 |
Vorwort | 46 |
Teil I: Grundlagen | 50 |
1 Einstieg in Visual Studio 2015 | 52 |
1.1 Die Installation von Visual Studio 2015 | 52 |
1.1.1 Überblick über die Produktpalette | 52 |
1.1.2 Anforderungen an Hard- und Software | 53 |
1.2 Unser allererstes C#-Programm | 54 |
1.2.1 Vorbereitungen | 54 |
1.2.2 Quellcode schreiben | 56 |
1.2.3 Programm kompilieren und testen | 56 |
1.2.4 Einige Erläuterungen zum Quellcode | 57 |
1.2.5 Konsolenanwendungen sind out | 58 |
1.3 Die Windows-Philosophie | 58 |
1.3.1 Mensch-Rechner-Dialog | 58 |
1.3.2 Objekt- und ereignisorientierte Programmierung | 59 |
1.3.3 Programmieren mit Visual Studio 2015 | 60 |
1.4 Die Entwicklungsumgebung Visual Studio 2015 | 61 |
1.4.1 Neues Projekt | 62 |
1.4.2 Die wichtigsten Fenster | 63 |
1.5 Microsofts .NET-Technologie | 66 |
1.5.1 Zur Geschichte von .NET | 66 |
1.5.2 .NET-Features und Begriffe | 68 |
1.6 Wichtige Neuigkeiten in Visual Studio 2015 | 75 |
1.6.1 Entwicklungsumgebung | 75 |
1.6.2 Neue C#-Sprachfeatures | 75 |
1.6.3 Code-Editor | 76 |
1.6.4 NET Framework 4.6 | 76 |
1.7 Praxisbeispiele | 77 |
1.7.1 Unsere erste Windows Forms-Anwendung | 77 |
1.7.2 Umrechnung Euro-Dollar | 81 |
2 Grundlagen der Sprache C# | 90 |
2.1 Grundbegriffe | 90 |
2.1.1 Anweisungen | 90 |
2.1.2 Bezeichner | 91 |
2.1.3 Schlüsselwörter | 92 |
2.1.4 Kommentare | 92 |
2.2 Datentypen, Variablen und Konstanten | 93 |
2.2.1 Fundamentale Typen | 93 |
2.2.2 Wertetypen versus Verweistypen | 94 |
2.2.3 Benennung von Variablen | 95 |
2.2.4 Deklaration von Variablen | 95 |
2.2.5 Typsuffixe | 97 |
2.2.6 Zeichen und Zeichenketten | 98 |
2.2.7 object-Datentyp | 100 |
2.2.8 Konstanten deklarieren | 100 |
2.2.9 Nullable Types | 101 |
2.2.10 Typinferenz | 102 |
2.2.11 Gültigkeitsbereiche und Sichtbarkeit | 103 |
2.3 Konvertieren von Datentypen | 103 |
2.3.1 Implizite und explizite Konvertierung | 103 |
2.3.2 Welcher Datentyp passt zu welchem? | 105 |
2.3.3 Konvertieren von string | 106 |
2.3.4 Die Convert-Klasse | 108 |
2.3.5 Die Parse-Methode | 108 |
2.3.6 Boxing und Unboxing | 109 |
2.4 Operatoren | 110 |
2.4.1 Arithmetische Operatoren | 111 |
2.4.2 Zuweisungsoperatoren | 112 |
2.4.3 Logische Operatoren | 113 |
2.4.4 Rangfolge der Operatoren | 116 |
2.5 Kontrollstrukturen | 117 |
2.5.1 Verzweigungsbefehle | 117 |
2.5.2 Schleifenanweisungen | 120 |
2.6 Benutzerdefinierte Datentypen | 123 |
2.6.1 Enumerationen | 123 |
2.6.2 Strukturen | 124 |
2.7 Nutzerdefinierte Methoden | 126 |
2.7.1 Methoden mit Rückgabewert | 127 |
2.7.2 Methoden ohne Rückgabewert | 128 |
2.7.3 Parameterübergabe mit ref | 129 |
2.7.4 Parameterübergabe mit out | 130 |
2.7.5 Methodenüberladung | 131 |
2.7.6 Optionale Parameter | 132 |
2.7.7 Benannte Parameter | 133 |
2.8 Praxisbeispiele | 134 |
2.8.1 Vom PAP zur Konsolenanwendung | 134 |
2.8.2 Ein Konsolen- in ein Windows-Programm verwandeln | 136 |
2.8.3 Schleifenanweisungen verstehen | 138 |
2.8.4 Benutzerdefinierte Methoden überladen | 140 |
2.8.5 Anwendungen von Visual Basic nach C# portieren | 143 |
3 OOP-Konzepte | 150 |
3.1 Kleine Einführung in die OOP | 150 |
3.1.1 Historische Entwicklung | 150 |
3.1.2 Grundbegriffe der OOP | 152 |
3.1.3 Sichtbarkeit von Klassen und ihren Mitgliedern | 154 |
3.1.4 Allgemeiner Aufbau einer Klasse | 155 |
3.1.5 Das Erzeugen eines Objekts | 156 |
3.1.6 Einführungsbeispiel | 159 |
3.2 Eigenschaften | 164 |
3.2.1 Eigenschaften mit Zugriffsmethoden kapseln | 164 |
3.2.2 Berechnete Eigenschaften | 166 |
3.2.3 Lese-/Schreibschutz | 168 |
3.2.4 Property-Accessoren | 169 |
3.2.5 Statische Felder/Eigenschaften | 169 |
3.2.6 Einfache Eigenschaften automatisch implementieren | 172 |
3.3 Methoden | 173 |
3.3.1 Öffentliche und private Methoden | 173 |
3.3.2 Überladene Methoden | 174 |
3.3.3 Statische Methoden | 175 |
3.4 Ereignisse | 177 |
3.4.1 Ereignis hinzufügen | 177 |
3.4.2 Ereignis verwenden | 180 |
3.5 Arbeiten mit Konstruktor und Destruktor | 183 |
3.5.1 Konstruktor und Objektinitialisierer | 183 |
3.5.2 Destruktor und Garbage Collector | 186 |
3.5.3 Mit using den Lebenszyklus des Objekts kapseln | 189 |
3.5.4 Verzögerte Initialisierung | 189 |
3.6 Vererbung und Polymorphie | 190 |
3.6.1 Klassendiagramm | 190 |
3.6.2 Method-Overriding | 191 |
3.6.3 Klassen implementieren | 192 |
3.6.4 Implementieren der Objekte | 195 |
3.6.5 Ausblenden von Mitgliedern durch Vererbung | 197 |
3.6.6 Allgemeine Hinweise und Regeln zur Vererbung | 198 |
3.6.7 Polymorphes Verhalten | 200 |
3.6.8 Die Rolle von System.Object | 202 |
3.7 Spezielle Klassen | 203 |
3.7.1 Abstrakte Klassen | 203 |
3.7.2 Versiegelte Klassen | 205 |
3.7.3 Partielle Klassen | 205 |
3.7.4 Statische Klassen | 206 |
3.8 Schnittstellen (Interfaces) | 207 |
3.8.1 Definition einer Schnittstelle | 208 |
3.8.2 Implementieren einer Schnittstelle | 208 |
3.8.3 Abfragen, ob Schnittstelle vorhanden ist | 209 |
3.8.4 Mehrere Schnittstellen implementieren | 210 |
3.8.5 Schnittstellenprogrammierung ist ein weites Feld | 210 |
3.9 Praxisbeispiele | 210 |
3.9.1 Eigenschaften sinnvoll kapseln | 210 |
3.9.2 Eine statische Klasse anwenden | 213 |
3.9.3 Vom fetten zum schlanken Client | 215 |
3.9.4 Schnittstellenvererbung verstehen | 227 |
3.9.5 Rechner für komplexe Zahlen | 232 |
3.9.6 Formel-Rechner mit dem CodeDOM | 241 |
3.9.7 Berechnungsergebnisse als Diagramm darstellen | 249 |
3.9.8 Sortieren mit IComparable/IComparer | 253 |
3.9.9 Einen Objektbaum in generischen Listen abspeichern | 258 |
3.9.10 OOP beim Kartenspiel erlernen | 264 |
3.9.11 Eine Klasse zur Matrizenrechnung entwickeln | 268 |
4 Arrays, Strings, Funktionen | 274 |
4.1 Datenfelder (Arrays) | 274 |
4.1.1 Array deklarieren | 274 |
4.1.2 Array instanziieren | 275 |
4.1.3 Array initialisieren | 275 |
4.1.4 Zugriff auf Array-Elemente | 276 |
4.1.5 Zugriff mittels Schleife | 277 |
4.1.6 Mehrdimensionale Arrays | 278 |
4.1.7 Zuweisen von Arrays | 280 |
4.1.8 Arrays aus Strukturvariablen | 281 |
4.1.9 Löschen und Umdimensionieren von Arrays | 282 |
4.1.10 Eigenschaften und Methoden von Arrays | 283 |
4.1.11 Übergabe von Arrays | 285 |
4.2 Verarbeiten von Zeichenketten | 286 |
4.2.1 Zuweisen von Strings | 286 |
4.2.2 Eigenschaften und Methoden von String-Variablen | 287 |
4.2.3 Wichtige Methoden der String-Klasse | 289 |
4.2.4 Die StringBuilder-Klasse | 291 |
4.3 Reguläre Ausdrücke | 293 |
4.3.1 Wozu werden reguläre Ausdrücke verwendet? | 294 |
4.3.2 Eine kleine Einführung | 294 |
4.3.3 Wichtige Methoden/Eigenschaften der Klasse Regex | 295 |
4.3.4 Kompilierte reguläre Ausdrücke | 297 |
4.3.5 RegexOptions-Enumeration | 298 |
4.3.6 Metazeichen (Escape-Zeichen) | 298 |
4.3.7 Zeichenmengen (Character Sets) | 299 |
4.3.8 Quantifizierer | 301 |
4.3.9 Zero-Width Assertions | 302 |
4.3.10 Gruppen | 305 |
4.3.11 Text ersetzen | 306 |
4.3.12 Text splitten | 307 |
4.4 Datums- und Zeitberechnungen | 308 |
4.4.1 Die DateTime-Struktur | 308 |
4.4.2 Wichtige Eigenschaften von DateTime-Variablen | 309 |
4.4.3 Wichtige Methoden von DateTime-Variablen | 310 |
4.4.4 Wichtige Mitglieder der DateTime-Struktur | 310 |
4.4.5 Konvertieren von Datumstrings in DateTime-Werte | 311 |
4.4.6 Die TimeSpan-Struktur | 312 |
4.5 Mathematische Funktionen | 313 |
4.5.1 Überblick | 313 |
4.5.2 Zahlen runden | 314 |
4.5.3 Winkel umrechnen | 314 |
4.5.4 Potenz- und Wurzeloperationen | 314 |
4.5.5 Logarithmus und Exponentialfunktionen | 315 |
4.5.6 Zufallszahlen erzeugen | 315 |
4.6 Zahlen- und Datumsformatierungen | 316 |
4.6.1 Anwenden der ToString-Methode | 316 |
4.6.2 Anwenden der Format-Methode | 318 |
4.6.3 Stringinterpolation | 319 |
4.7 Praxisbeispiele | 320 |
4.7.1 Zeichenketten verarbeiten | 320 |
4.7.2 Zeichenketten mit StringBuilder addieren | 323 |
4.7.3 Reguläre Ausdrücke testen | 326 |
4.7.4 Methodenaufrufe mit Array-Parametern | 328 |
5 Weitere Sprachfeatures | 332 |
5.1 Namespaces (Namensräume) | 332 |
5.1.1 Ein kleiner Überblick | 332 |
5.1.2 Einen eigenen Namespace einrichten | 333 |
5.1.3 Die using-Anweisung | 334 |
5.1.4 Namespace Alias | 335 |
5.1.5 Namespace Alias Qualifizierer | 335 |
5.2 Operatorenüberladung | 336 |
5.2.1 Syntaxregeln | 336 |
5.2.2 Praktische Anwendung | 337 |
5.3 Collections (Auflistungen) | 338 |
5.3.1 Die Schnittstelle IEnumerable | 338 |
5.3.2 ArrayList | 340 |
5.3.3 Hashtable | 342 |
5.3.4 Indexer | 342 |
5.4 Generics | 344 |
5.4.1 Klassische Vorgehensweise | 345 |
5.4.2 Generics bieten Typsicherheit | 346 |
5.4.3 Generische Methoden | 347 |
5.4.4 Iteratoren | 348 |
5.5 Generische Collections | 349 |
5.5.1 List-Collection statt ArrayList | 349 |
5.5.2 Vorteile generischer Collections | 350 |
5.5.3 Constraints | 350 |
5.6 Das Prinzip der Delegates | 350 |
5.6.1 Delegates sind Methodenzeiger | 351 |
5.6.2 Einen Delegate-Typ deklarieren | 351 |
5.6.3 Ein Delegate-Objekt erzeugen | 351 |
5.6.4 Delegates vereinfacht instanziieren | 353 |
5.6.5 Anonyme Methoden | 354 |
5.6.6 Lambda-Ausdrücke | 355 |
5.6.7 Lambda-Ausdrücke in der Task Parallel Library | 357 |
5.7 Dynamische Programmierung | 359 |
5.7.1 Wozu dynamische Programmierung? | 359 |
5.7.2 Das Prinzip der dynamischen Programmierung | 359 |
5.7.3 Optionale Parameter sind hilfreich | 362 |
5.7.4 Kovarianz und Kontravarianz | 363 |
5.8 Weitere Datentypen | 363 |
5.8.1 BigInteger | 363 |
5.8.2 Complex | 366 |
5.8.3 Tuple<> | 366 |
5.8.4 SortedSet<> | 367 |
5.9 Praxisbeispiele | 368 |
5.9.1 ArrayList versus generische List | 368 |
5.9.2 Generische IEnumerable-Interfaces implementieren | 372 |
5.9.3 Delegates, anonyme Methoden, Lambda Expressions | 375 |
5.9.4 Dynamischer Zugriff auf COM Interop | 379 |
6 Einführung in LINQ | 382 |
6.1 LINQ-Grundlagen | 382 |
6.1.1 Die LINQ-Architektur | 382 |
6.1.2 Anonyme Typen | 383 |
6.1.3 Erweiterungsmethoden | 385 |
6.2 Abfragen mit LINQ to Objects | 386 |
6.2.1 Grundlegendes zur LINQ-Syntax | 386 |
6.2.2 Zwei alternative Schreibweisen von LINQ Abfragen | 387 |
6.2.3 Übersicht der wichtigsten Abfrage-Operatoren | 388 |
6.3 LINQ-Abfragen im Detail | 389 |
6.3.1 Die Projektionsoperatoren Select und SelectMany | 390 |
6.3.2 Der Restriktionsoperator Where | 391 |
6.3.3 Die Sortierungsoperatoren OrderBy und ThenBy | 392 |
6.3.4 Der Gruppierungsoperator GroupBy | 393 |
6.3.5 Verknüpfen mit Join | 396 |
6.3.6 Aggregat-Operatoren | 396 |
6.3.7 Verzögertes Ausführen von LINQ-Abfragen | 398 |
6.3.8 Konvertierungsmethoden | 399 |
6.3.9 Abfragen mit PLINQ | 399 |
6.4 Praxisbeispiele | 402 |
6.4.1 Die Syntax von LINQ-Abfragen verstehen | 402 |
6.4.2 Aggregat-Abfragen mit LINQ | 405 |
6.4.3 LINQ im Schnelldurchgang erlernen | 408 |
6.4.4 Strings mit LINQ abfragen und filtern | 410 |
6.4.5 Duplikate aus einer Liste oder einem Array entfernen | 411 |
6.4.6 Arrays mit LINQ initialisieren | 414 |
6.4.7 Arrays per LINQ mit Zufallszahlen füllen | 416 |
6.4.8 Einen String mit Wiederholmuster erzeugen | 418 |
6.4.9 Mit LINQ Zahlen und Strings sortieren | 419 |
6.4.10 Mit LINQ Collections von Objekten sortieren | 420 |
6.4.11 Ergebnisse von LINQ-Abfragen in ein Array kopieren | 423 |
Teil II: Technologien | 424 |
7 Zugriff auf das Dateisystem | 426 |
7.1 Grundlagen | 426 |
7.1.1 Klassen für den Zugriff auf das Dateisystem | 427 |
7.1.2 Statische versus Instanzen-Klasse | 427 |
7.2 Übersichten | 428 |
7.2.1 Methoden der Directory-Klasse | 428 |
7.2.2 Methoden eines DirectoryInfo-Objekts | 429 |
7.2.3 Eigenschaften eines DirectoryInfo-Objekts | 429 |
7.2.4 Methoden der File-Klasse | 429 |
7.2.5 Methoden eines FileInfo-Objekts | 430 |
7.2.6 Eigenschaften eines FileInfo-Objekts | 431 |
7.3 Operationen auf Verzeichnisebene | 431 |
7.3.1 Existenz eines Verzeichnisses/einer Datei feststellen | 431 |
7.3.2 Verzeichnisse erzeugen und löschen | 432 |
7.3.3 Verzeichnisse verschieben und umbenennen | 432 |
7.3.4 Aktuelles Verzeichnis bestimmen | 433 |
7.3.5 Unterverzeichnisse ermitteln | 433 |
7.3.6 Alle Laufwerke ermitteln | 433 |
7.3.7 Dateien kopieren und verschieben | 434 |
7.3.8 Dateien umbenennen | 435 |
7.3.9 Dateiattribute feststellen | 435 |
7.3.10 Verzeichnis einer Datei ermitteln | 437 |
7.3.11 Alle im Verzeichnis enthaltenen Dateien ermitteln | 437 |
7.3.12 Dateien und Unterverzeichnisse ermitteln | 437 |
7.4 Zugriffsberechtigungen | 438 |
7.4.1 ACL und ACE | 438 |
7.4.2 SetAccessControl-Methode | 439 |
7.4.3 Zugriffsrechte anzeigen | 439 |
7.5 Weitere wichtige Klassen | 440 |
7.5.1 Die Path-Klasse | 440 |
7.5.2 Die Klasse FileSystemWatcher | 441 |
7.6 Datei- und Verzeichnisdialoge | 442 |
7.6.1 OpenFileDialog und SaveFileDialog | 443 |
7.6.2 FolderBrowserDialog | 444 |
7.7 Praxisbeispiele | 445 |
7.7.1 Infos über Verzeichnisse und Dateien gewinnen | 445 |
7.7.2 Eine Verzeichnisstruktur in die TreeView einlesen | 449 |
7.7.3 Mit LINQ und RegEx Verzeichnisbäume durchsuchen | 451 |
8 Dateien lesen und schreiben | 456 |
8.1 Grundprinzip der Datenpersistenz | 456 |
8.1.1 Dateien und Streams | 456 |
8.1.2 Die wichtigsten Klassen | 457 |
8.1.3 Erzeugen eines Streams | 458 |
8.2 Dateiparameter | 458 |
8.2.1 FileAccess | 458 |
8.2.2 FileMode | 458 |
8.2.3 FileShare | 459 |
8.3 Textdateien | 459 |
8.3.1 Eine Textdatei beschreiben bzw. neu anlegen | 459 |
8.3.2 Eine Textdatei lesen | 461 |
8.4 Binärdateien | 462 |
8.4.1 Lese-/Schreibzugriff | 462 |
8.4.2 Die Methoden ReadAllBytes und WriteAllBytes | 463 |
8.4.3 Erzeugen von BinaryReader/BinaryWriter | 463 |
8.5 Sequenzielle Dateien | 464 |
8.5.1 Lesen und schreiben von strukturierten Daten | 464 |
8.5.2 Serialisieren von Objekten | 465 |
8.6 Dateien verschlüsseln und komprimieren | 466 |
8.6.1 Das Methodenpärchen Encrypt/Decrypt | 466 |
8.6.2 Verschlüsseln unter Windows Vista/7/8/10 | 466 |
8.6.3 Verschlüsseln mit der CryptoStream-Klasse | 467 |
8.6.4 Dateien komprimieren | 468 |
8.7 Memory Mapped Files | 469 |
8.7.1 Grundprinzip | 469 |
8.7.2 Erzeugen eines MMF | 470 |
8.7.3 Erstellen eines Map View | 471 |
8.8 Praxisbeispiele | 472 |
8.8.1 Auf eine Textdatei zugreifen | 472 |
8.8.2 Einen Objektbaum persistent speichern | 475 |
8.8.3 Ein Memory Mapped File (MMF) verwenden | 482 |
8.8.4 Hex-Dezimal-Bytes-Konverter | 484 |
8.8.5 Eine Datei verschlüsseln | 488 |
8.8.6 Eine Datei komprimieren | 491 |
8.8.7 Echte ZIP-Dateien erstellen | 493 |
8.8.8 PDFs erstellen/exportieren | 495 |
8.8.9 Eine CSV-Datei erstellen | 498 |
8.8.10 Eine CSV-Datei mit LINQ lesen und auswerten | 501 |
8.8.11 Einen korrekten Dateinamen erzeugen | 504 |
9 Asynchrone Programmierung | 506 |
9.1 Übersicht | 506 |
9.1.1 Multitasking versus Multithreading | 507 |
9.1.2 Deadlocks | 508 |
9.1.3 Racing | 508 |
9.2 Programmieren mit Threads | 510 |
9.2.1 Einführungsbeispiel | 510 |
9.2.2 Wichtige Thread-Methoden | 511 |
9.2.3 Wichtige Thread-Eigenschaften | 513 |
9.2.4 Einsatz der ThreadPool-Klasse | 514 |
9.3 Sperrmechanismen | 516 |
9.3.1 Threading ohne lock | 516 |
9.3.2 Threading mit lock | 518 |
9.3.3 Die Monitor-Klasse | 520 |
9.3.4 Mutex | 523 |
9.3.5 Methoden für die parallele Ausführung sperren | 525 |
9.3.6 Semaphore | 525 |
9.4 Interaktion mit der Programmoberfläche | 527 |
9.4.1 Die Werkzeuge | 527 |
9.4.2 Einzelne Steuerelemente mit Invoke aktualisieren | 527 |
9.4.3 Mehrere Steuerelemente aktualisieren | 529 |
9.4.4 Ist ein Invoke-Aufruf nötig? | 529 |
9.4.5 Und was ist mit WPF? | 530 |
9.5 Timer-Threads | 531 |
9.6 Die BackgroundWorker-Komponente | 532 |
9.7 Asynchrone Programmier-Entwurfsmuster | 535 |
9.7.1 Kurzübersicht | 535 |
9.7.2 Polling | 536 |
9.7.3 Callback verwenden | 538 |
9.7.4 Callback mit Parameterübergabe verwenden | 539 |
9.7.5 Callback mit Zugriff auf die Programm-Oberfläche | 540 |
9.8 Asynchroner Aufruf beliebiger Methoden | 541 |
9.8.1 Die Beispielklasse | 541 |
9.8.2 Asynchroner Aufruf ohne Callback | 543 |
9.8.3 Asynchroner Aufruf mit Callback und Anzeigefunktion | 544 |
9.8.4 Aufruf mit Rückgabewerten (per Eigenschaft) | 545 |
9.8.5 Aufruf mit Rückgabewerten (per EndInvoke) | 545 |
9.9 Es geht auch einfacher – async und await | 546 |
9.9.1 Der Weg von Synchron zu Asynchron | 547 |
9.9.2 Achtung: Fehlerquellen! | 549 |
9.9.3 Eigene asynchrone Methoden entwickeln | 551 |
9.10 Praxisbeispiele | 553 |
9.10.1 Spieltrieb & Multithreading erleben | 553 |
9.10.2 Prozess- und Thread-Informationen gewinnen | 566 |
9.10.3 Ein externes Programm starten | 571 |
10 Die Task Parallel Library | 574 |
10.1 Überblick | 574 |
10.1.1 Parallel-Programmierung | 574 |
10.1.2 Möglichkeiten der TPL | 577 |
10.1.3 Der CLR-Threadpool | 577 |
10.2 Parallele Verarbeitung mit Parallel.Invoke | 578 |
10.2.1 Aufrufvarianten | 579 |
10.2.2 Einschränkungen | 580 |
10.3 Verwendung von Parallel.For | 580 |
10.3.1 Abbrechen der Verarbeitung | 582 |
10.3.2 Auswerten des Verarbeitungsstatus | 583 |
10.3.3 Und was ist mit anderen Iterator-Schrittweiten? | 584 |
10.4 Collections mit Parallel.ForEach verarbeiten | 584 |
10.5 Die Task-Klasse | 585 |
10.5.1 Einen Task erzeugen | 585 |
10.5.2 Den Task starten | 586 |
10.5.3 Datenübergabe an den Task | 588 |
10.5.4 Wie warte ich auf das Ende des Task? | 589 |
10.5.5 Tasks mit Rückgabewerten | 591 |
10.5.6 Die Verarbeitung abbrechen | 594 |
10.5.7 Fehlerbehandlung | 597 |
10.5.8 Weitere Eigenschaften | 598 |
10.6 Zugriff auf das User-Interface | 599 |
10.6.1 Task-Ende und Zugriff auf die Oberfläche | 600 |
10.6.2 Zugriff auf das UI aus dem Task heraus | 601 |
10.7 Weitere Datenstrukturen im Überblick | 603 |
10.7.1 Threadsichere Collections | 603 |
10.7.2 Primitive für die Threadsynchronisation | 604 |
10.8 Parallel LINQ (PLINQ) | 604 |
10.9 Praxisbeispiel: Spieltrieb – Version 2 | 605 |
10.9.1 Aufgabenstellung | 605 |
10.9.2 Global-Klasse | 605 |
10.9.3 Controller-Klasse | 607 |
10.9.4 LKW-Klasse | 608 |
10.9.5 Schiff-Klasse | 610 |
10.9.6 Oberfläche | 612 |
11 Fehlersuche und Behandlung | 614 |
11.1 Der Debugger | 614 |
11.1.1 Allgemeine Beschreibung | 614 |
11.1.2 Die wichtigsten Fenster | 615 |
11.1.3 Debugging-Optionen | 618 |
11.1.4 Praktisches Debugging am Beispiel | 620 |
11.2 Arbeiten mit Debug und Trace | 624 |
11.2.1 Wichtige Methoden von Debug und Trace | 624 |
11.2.2 Besonderheiten der Trace-Klasse | 628 |
11.2.3 TraceListener-Objekte | 628 |
11.3 Caller Information | 631 |
11.3.1 Attribute | 631 |
11.3.2 Anwendung | 631 |
11.4 Fehlerbehandlung | 632 |
11.4.1 Anweisungen zur Fehlerbehandlung | 632 |
11.4.2 try-catch | 633 |
11.4.3 try-finally | 638 |
11.4.4 Das Standardverhalten bei Ausnahmen festlegen | 640 |
11.4.5 Die Exception-Klasse | 641 |
11.4.6 Fehler/Ausnahmen auslösen | 642 |
11.4.7 Eigene Fehlerklassen | 642 |
11.4.8 Exceptionhandling zur Entwurfszeit | 644 |
11.4.9 Code Contracts | 645 |
12 XML in Theorie und Praxis | 646 |
12.1 XML – etwas Theorie | 646 |
12.1.1 Übersicht | 646 |
12.1.2 Der XML-Grundaufbau | 649 |
12.1.3 Wohlgeformte Dokumente | 650 |
12.1.4 Processing Instructions (PI) | 653 |
12.1.5 Elemente und Attribute | 653 |
12.1.6 Verwendbare Zeichensätze | 655 |
12.2 XSD-Schemas | 657 |
12.2.1 XSD-Schemas und ADO.NET | 657 |
12.2.2 XML-Schemas in Visual Studio analysieren | 659 |
12.2.3 XML-Datei mit XSD-Schema erzeugen | 662 |
12.2.4 XSD-Schema aus einer XML-Datei erzeugen | 663 |
12.3 Verwendung des DOM unter .NET | 664 |
12.3.1 Übersicht | 664 |
12.3.2 DOM-Integration in C# | 665 |
12.3.3 Laden von Dokumenten | 665 |
12.3.4 Erzeugen von XML-Dokumenten | 666 |
12.3.5 Auslesen von XML-Dateien | 668 |
12.3.6 Direktzugriff auf einzelne Elemente | 670 |
12.3.7 Einfügen von Informationen | 670 |
12.3.8 Suchen in den Baumzweigen | 673 |
12.4 XML-Verarbeitung mit LINQ to XML | 676 |
12.4.1 Die LINQ to XML-API | 676 |
12.4.2 Neue XML-Dokumente erzeugen | 678 |
12.4.3 Laden und Sichern von XML-Dokumenten | 680 |
12.4.4 Navigieren in XML-Daten | 681 |
12.4.5 Auswählen und Filtern | 683 |
12.4.6 Manipulieren der XML-Daten | 683 |
12.4.7 XML-Dokumente transformieren | 685 |
12.5 Weitere Möglichkeiten der XML-Verarbeitung | 688 |
12.5.1 Die relationale Sicht mit XmlDataDocument | 688 |
12.5.2 XML-Daten aus Objektstrukturen erzeugen | 691 |
12.5.3 Schnelles Suchen in XML-Daten mit XPathNavigator | 694 |
12.5.4 Schnelles Auslesen von XML-Daten mit XmlReader | 697 |
12.5.5 Erzeugen von XML-Daten mit XmlWriter | 699 |
12.5.6 XML transformieren mit XSLT | 701 |
12.6 Praxisbeispiele | 703 |
12.6.1 Mit dem DOM in XML-Dokumenten navigieren | 703 |
12.6.2 XML-Daten in eine TreeView einlesen | 706 |
12.6.3 Ein DataSet in einen XML-String konvertieren | 710 |
12.6.4 Ein DataSet in einer XML-Datei speichern | 714 |
12.6.5 In Dokumenten mit dem XPathNavigator navigieren | 717 |
13 Einführung in ADO.NET | 722 |
13.1 Eine kleine Übersicht | 722 |
13.1.1 Die ADO.NET-Klassenhierarchie | 722 |
13.1.2 Die Klassen der Datenprovider | 723 |
13.1.3 Das Zusammenspiel der ADO.NET-Klassen | 726 |
13.2 Das Connection-Objekt | 727 |
13.2.1 Allgemeiner Aufbau | 727 |
13.2.2 OleDbConnection | 727 |
13.2.3 Schließen einer Verbindung | 729 |
13.2.4 Eigenschaften des Connection-Objekts | 729 |
13.2.5 Methoden des Connection-Objekts | 731 |
13.2.6 Der ConnectionStringBuilder | 732 |
13.3 Das Command-Objekt | 732 |
13.3.1 Erzeugen und Anwenden eines Command-Objekts | 733 |
13.3.2 Erzeugen mittels CreateCommand-Methode | 733 |
13.3.3 Eigenschaften des Command-Objekts | 734 |
13.3.4 Methoden des Command-Objekts | 736 |
13.3.5 Freigabe von Connection- und Command-Objekten | 737 |
13.4 Parameter-Objekte | 738 |
13.4.1 Erzeugen und Anwenden eines Parameter-Objekts | 738 |
13.4.2 Eigenschaften des Parameter-Objekts | 739 |
13.5 Das CommandBuilder-Objekt | 740 |
13.5.1 Erzeugen | 740 |
13.5.2 Anwenden | 740 |
13.6 Das DataReader-Objekt | 741 |
13.6.1 DataReader erzeugen | 741 |
13.6.2 Daten lesen | 742 |
13.6.3 Eigenschaften des DataReaders | 743 |
13.6.4 Methoden des DataReaders | 743 |
13.7 Das DataAdapter-Objekt | 744 |
13.7.1 DataAdapter erzeugen | 744 |
13.7.2 Command-Eigenschaften | 745 |
13.7.3 Fill-Methode | 746 |
13.7.4 Update-Methode | 747 |
13.8 Praxisbeispiele | 748 |
13.8.1 Wichtige ADO.NET-Objekte im Einsatz | 748 |
13.8.2 Eine Aktionsabfrage ausführen | 749 |
13.8.3 Eine Auswahlabfrage aufrufen | 752 |
13.8.4 Die Datenbank aktualisieren | 754 |
14 Das DataSet | 758 |
14.1 Grundlegende Features des DataSets | 758 |
14.1.1 Die Objekthierarchie | 759 |
14.1.2 Die wichtigsten Klassen | 759 |
14.1.3 Erzeugen eines DataSets | 760 |
14.2 Das DataTable-Objekt | 761 |
14.2.1 DataTable erzeugen | 762 |
14.2.2 Spalten hinzufügen | 762 |
14.2.3 Zeilen zur DataTable hinzufügen | 763 |
14.2.4 Auf den Inhalt einer DataTable zugreifen | 764 |
14.3 Die DataView | 766 |
14.3.1 Erzeugen einer DataView | 766 |
14.3.2 Sortieren und Filtern von Datensätzen | 766 |
14.3.3 Suchen von Datensätzen | 767 |
14.4 Typisierte DataSets | 767 |
14.4.1 Ein typisiertes DataSet erzeugen | 768 |
14.4.2 Das Konzept der Datenquellen | 769 |
14.4.3 Typisierte DataSets und TableAdapter | 770 |
14.5 Die Qual der Wahl | 771 |
14.5.1 DataReader – der schnelle Lesezugriff | 772 |
14.5.2 DataSet – die Datenbank im Hauptspeicher | 772 |
14.5.3 Objektrelationales Mapping – die Zukunft? | 773 |
14.6 Praxisbeispiele | 774 |
14.6.1 In der DataView sortieren und filtern | 774 |
14.6.2 Suche nach Datensätzen | 776 |
14.6.3 Ein DataSet in einen XML-String serialisieren | 777 |
14.6.4 Untypisiertes in ein typisiertes DataSet konvertieren | 782 |
14.6.5 Eine LINQ to SQL-Abfrage ausführen | 787 |
15 Verteilen von Anwendungen | 792 |
15.1 ClickOnce-Deployment | 793 |
15.1.1 Übersicht/Einschränkungen | 793 |
15.1.2 Die Vorgehensweise | 794 |
15.1.3 Ort der Veröffentlichung | 794 |
15.1.4 Anwendungsdateien | 795 |
15.1.5 Erforderliche Komponenten | 795 |
15.1.6 Aktualisierungen | 796 |
15.1.7 Veröffentlichungsoptionen | 797 |
15.1.8 Veröffentlichen | 798 |
15.1.9 Verzeichnisstruktur | 798 |
15.1.10 Der Webpublishing-Assistent | 800 |
15.1.11 Neue Versionen erstellen | 801 |
15.2 InstallShield | 801 |
15.2.1 Installation | 801 |
15.2.2 Aktivieren | 802 |
15.2.3 Ein neues Setup-Projekt | 802 |
15.2.4 Finaler Test | 810 |
15.3 Hilfedateien programmieren | 810 |
15.3.1 Der HTML Help Workshop | 811 |
15.3.2 Bedienung am Beispiel | 812 |
15.3.3 Hilfedateien in die Visual C#-Anwendung einbinden | 814 |
15.3.4 Eine alternative Hilfe-IDE verwenden | 818 |
16 Weitere Techniken | 820 |
16.1 Zugriff auf die Zwischenablage | 820 |
16.1.1 Das Clipboard-Objekt | 820 |
16.1.2 Zwischenablage-Funktionen für Textboxen | 822 |
16.2 Arbeiten mit der Registry | 822 |
16.2.1 Allgemeines | 823 |
16.2.2 Registry-Unterstützung in .NET | 825 |
16.3 .NET-Reflection | 826 |
16.3.1 Übersicht | 826 |
16.3.2 Assembly laden | 826 |
16.3.3 Mittels GetType und Type Informationen sammeln | 827 |
16.3.4 Dynamisches Laden von Assemblies | 829 |
16.4 Praxisbeispiele | 832 |
16.4.1 Zugriff auf die Registry | 832 |
16.4.2 Dateiverknüpfungen erzeugen | 834 |
16.4.3 Betrachter für Manifestressourcen | 836 |
16.4.4 Die Zwischenablage überwachen und anzeigen | 839 |
16.4.5 Die WIA-Library kennenlernen | 842 |
16.4.6 Auf eine Webcam zugreifen | 854 |
16.4.7 Auf den Scanner zugreifen | 856 |
16.4.8 OpenOffice.org Writer per OLE steuern | 861 |
16.4.9 Nutzer und Gruppen des aktuellen Systems ermitteln | 869 |
16.4.10 Testen, ob Nutzer in einer Gruppe enthalten ist | 870 |
16.4.11 Testen, ob der Nutzer ein Administrator ist | 872 |
16.4.12 Die IP-Adressen des Computers bestimmen | 873 |
16.4.13 Die IP-Adresse über den Hostnamen bestimmen | 874 |
16.4.14 Diverse Systeminformationen ermitteln | 875 |
16.4.15 Environment Variablen auslesen | 879 |
16.4.16 Alles über den Bildschirm erfahren | 883 |
16.4.17 Sound per MCI aufnehmen | 884 |
16.4.18 Mikrofonpegel anzeigen | 888 |
16.4.19 Pegeldiagramm aufzeichnen | 889 |
16.4.20 Sound-und Video-Dateien per MCI abspielen | 893 |
17 Konsolenanwendungen | 902 |
17.1 Grundaufbau/Konzepte | 902 |
17.1.1 Unser Hauptprogramm – Program.cs | 903 |
17.1.2 Rückgabe eines Fehlerstatus | 904 |
17.1.3 Parameterübergabe | 905 |
17.1.4 Zugriff auf die Umgebungsvariablen | 906 |
17.2 Die Kommandozentrale: System.Console | 907 |
17.2.1 Eigenschaften | 908 |
17.2.2 Methoden/Ereignisse | 908 |
17.2.3 Textausgaben | 909 |
17.2.4 Farbangaben | 910 |
17.2.5 Tastaturabfragen | 911 |
17.2.6 Arbeiten mit Streamdaten | 912 |
17.3 Praxisbeispiel | 914 |
17.3.1 Farbige Konsolenanwendung | 914 |
17.3.2 Weitere Hinweise und Beispiele | 916 |
Teil III: Windows Apps | 918 |
18 Erste Schritte | 920 |
18.1 Grundkonzepte und Begriffe | 920 |
18.1.1 Windows Runtime (WinRT) | 920 |
18.1.2 Windows Apps | 921 |
18.1.3 Fast and Fluid | 922 |
18.1.4 Process Sandboxing und Contracts | 923 |
18.1.5 .NET WinRT-Profil | 925 |
18.1.6 Language Projection | 925 |
18.1.7 Vollbildmodus – War da was? | 927 |
18.1.8 Windows Store | 927 |
18.1.9 Zielplattformen | 928 |
18.2 Entwurfsumgebung | 929 |
18.2.1 Betriebssystem | 929 |
18.2.2 Windows-Simulator | 929 |
18.2.3 Remote-Debugging | 932 |
18.3 Ein (kleines) Einstiegsbeispiel | 933 |
18.3.1 Aufgabenstellung | 933 |
18.3.2 Quellcode | 933 |
18.3.3 Oberflächenentwurf | 936 |
18.3.4 Installation und Test | 938 |
18.3.5 Touchscreen | 940 |
18.3.6 Fazit | 940 |
18.4 Weitere Details zu WinRT | 942 |
18.4.1 Wo ist WinRT einzuordnen? | 943 |
18.4.2 Die WinRT-API | 944 |
18.4.3 Wichtige WinRT-Namespaces | 946 |
18.4.4 Der Unterbau | 947 |
18.5 Praxisbeispiel | 949 |
18.5.1 WinRT in Desktop-Applikationen nutzen | 949 |
19 App-Oberflächen entwerfen | 954 |
19.1 Grundkonzepte | 954 |
19.1.1 XAML (oder HTML 5) für die Oberfläche | 955 |
19.1.2 Die Page, der Frame und das Window | 956 |
19.1.3 Das Befehlsdesign | 958 |
19.1.4 Die Navigationsdesigns | 960 |
19.1.5 Achtung: Fingereingabe! | 961 |
19.1.6 Verwendung von Schriftarten | 961 |
19.2 Seitenauswahl und -navigation | 962 |
19.2.1 Die Startseite festlegen | 962 |
19.2.2 Navigation und Parameterübergabe | 962 |
19.2.3 Den Seitenstatus erhalten | 963 |
19.3 App-Darstellung | 964 |
19.3.1 Vollbild quer und hochkant | 964 |
19.3.2 Was ist mit Andocken und Füllmodus? | 965 |
19.3.3 Reagieren auf die Änderung | 965 |
19.4 Skalieren von Apps | 967 |
19.5 Praxisbeispiele | 970 |
19.5.1 Seitennavigation und Parameterübergabe | 970 |
19.5.2 Die Fensterkopfzeile anpassen | 972 |
20 Die wichtigsten Controls | 974 |
20.1 Einfache WinRT-Controls | 974 |
20.1.1 TextBlock, RichTextBlock | 974 |
20.1.2 Button, HyperlinkButton, RepeatButton | 977 |
20.1.3 CheckBox, RadioButton, ToggleButton, ToggleSwitch | 979 |
20.1.4 TextBox, PasswordBox, RichEditBox | 980 |
20.1.5 Image | 984 |
20.1.6 ScrollBar, Slider, ProgressBar, ProgressRing | 986 |
20.1.7 Border, Ellipse, Rectangle | 987 |
20.2 Layout-Controls | 988 |
20.2.1 Canvas | 988 |
20.2.2 StackPanel | 989 |
20.2.3 ScrollViewer | 989 |
20.2.4 Grid | 990 |
20.2.5 VariableSizedWrapGrid | 991 |
20.2.6 SplitView | 992 |
20.2.7 Pivot | 996 |
20.2.8 RelativPanel | 998 |
20.3 Listendarstellungen | 1000 |
20.3.1 ComboBox, ListBox | 1000 |
20.3.2 ListView | 1004 |
20.3.3 GridView | 1005 |
20.3.4 FlipView | 1007 |
20.4 Sonstige Controls | 1009 |
20.4.1 CaptureElement | 1009 |
20.4.2 MediaElement | 1011 |
20.4.3 Frame | 1012 |
20.4.4 WebView | 1012 |
20.4.5 ToolTip | 1013 |
20.4.6 CalendarDatePicker | 1015 |
20.4.7 DatePicker/TimePicker | 1016 |
20.5 Praxisbeispiele | 1016 |
20.5.1 Einen StringFormat-Konverter implementieren | 1016 |
20.5.2 Besonderheiten der TextBox kennen lernen | 1018 |
20.5.3 Daten in der GridView gruppieren | 1022 |
20.5.4 Das SemanticZoom-Control verwenden | 1026 |
20.5.5 Die CollectionViewSource verwenden | 1031 |
20.5.6 Zusammenspiel ListBox/AppBar | 1034 |
21 Apps im Detail | 1038 |
21.1 Ein Windows App-Projekt im Detail | 1038 |
21.1.1 Contracts und Extensions | 1039 |
21.1.2 AssemblyInfo.cs | 1039 |
21.1.3 Verweise | 1041 |
21.1.4 App.xaml und App.xaml.cs | 1041 |
21.1.5 Package.appxmanifest | 1042 |
21.1.6 Application1_TemporaryKey.pfx | 1047 |
21.1.7 MainPage.xaml & MainPage.xaml.cs | 1047 |
21.1.8 Assets/Symbole | 1048 |
21.1.9 Nach dem Kompilieren | 1048 |
21.2 Der Lebenszyklus einer Windows App | 1048 |
21.2.1 Möglichkeiten der Aktivierung von Apps | 1050 |
21.2.2 Der Splash Screen | 1052 |
21.2.3 Suspending | 1052 |
21.2.4 Resuming | 1054 |
21.2.5 Beenden von Apps | 1054 |
21.2.6 Die Ausnahmen von der Regel | 1055 |
21.2.7 Debuggen | 1055 |
21.3 Daten speichern und laden | 1059 |
21.3.1 Grundsätzliche Überlegungen | 1059 |
21.3.2 Worauf und wie kann ich zugreifen? | 1059 |
21.3.3 Das AppData-Verzeichnis | 1060 |
21.3.4 Das Anwendungs-Installationsverzeichnis | 1062 |
21.3.5 Das Downloads-Verzeichnis | 1063 |
21.3.6 Sonstige Verzeichnisse | 1064 |
21.3.7 Anwendungsdaten lokal sichern und laden | 1064 |
21.3.8 Daten in der Cloud ablegen/laden (Roaming) | 1066 |
21.3.9 Aufräumen | 1068 |
21.3.10 Sensible Informationen speichern | 1069 |
21.4 Praxisbeispiele | 1070 |
21.4.1 Die Auto-Play-Funktion unterstützen | 1070 |
21.4.2 Einen zusätzlichen Splash Screen einsetzen | 1074 |
21.4.3 Eine Dateiverknüpfung erstellen | 1076 |
22 App-Techniken | 1082 |
22.1 Arbeiten mit Dateien/Verzeichnissen | 1082 |
22.1.1 Verzeichnisinformationen auflisten | 1082 |
22.1.2 Unterverzeichnisse auflisten | 1085 |
22.1.3 Verzeichnisse erstellen/löschen | 1086 |
22.1.4 Dateien auflisten | 1088 |
22.1.5 Dateien erstellen/schreiben/lesen | 1090 |
22.1.6 Dateien kopieren/umbenennen/löschen | 1094 |
22.1.7 Verwenden der Dateipicker | 1095 |
22.1.8 StorageFile-/StorageFolder-Objekte speichern | 1100 |
22.1.9 Verwenden der Most Recently Used-Liste | 1102 |
22.2 Datenaustausch zwischen Apps/Programmen | 1103 |
22.2.1 Zwischenablage | 1103 |
22.2.2 Teilen von Inhalten | 1110 |
22.2.3 Eine App als Freigabeziel verwenden | 1114 |
22.2.4 Zugriff auf die Kontaktliste | 1115 |
22.3 Spezielle Oberflächenelemente | 1116 |
22.3.1 MessageDialog | 1117 |
22.3.2 ContentDialog | 1120 |
22.3.3 Popup-Benachrichtigungen | 1122 |
22.3.4 PopUp/Flyouts | 1130 |
22.3.5 Das PopupMenu einsetzen | 1133 |
22.3.6 Eine AppBar/CommandBar verwenden | 1134 |
22.4 Datenbanken und Windows Store Apps | 1138 |
22.4.1 Der Retter in der Not: SQLite! | 1138 |
22.4.2 Verwendung/Kurzüberblick | 1139 |
22.4.3 Installation | 1140 |
22.4.4 Wie kommen wir zu einer neuen Datenbank? | 1141 |
22.4.5 Wie werden die Daten manipuliert? | 1145 |
22.5 Vertrieb der App | 1147 |
22.5.1 Verpacken der App | 1147 |
22.5.2 App-Installation per Skript | 1149 |
22.6 Ein Blick auf die App-Schwachstellen | 1150 |
22.6.1 Quellcodes im Installationsverzeichnis | 1150 |
22.6.2 Zugriff auf den App-Datenordner | 1152 |
22.7 Praxisbeispiele | 1153 |
22.7.1 Ein Verzeichnis auf Änderungen überwachen | 1153 |
22.7.2 Eine App als Freigabeziel verwenden | 1155 |
22.7.3 ToastNotifications einfach erzeugen | 1160 |
Anhang | 1166 |
A Glossar | 1168 |
B Wichtige Dateiextensions | 1174 |
Index | 1176 |
Download-Kapitel | 30 |