Walter Doberenz, Thomas Gewinnus, Walter Saumweber
Visual C# 2017 - Grundlagen, Profiwissen und Rezepte
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
© 2009-2024 ciando GmbH