Schlagwörter
C#, C SharpNET, Visual Studio, Programmierung
Inhaltsverzeichnis
Inhaltsverzeichnis
Einleitung XV
Zahlen und Enumerationen 1
1.1 Prüfen, ob ein Bruch und eine Fließkommazahl ungefähr gleich sind 3
1.2 Grad in Rad umwandeln 5
1.3 Rad in Grad umwandeln 5
1.4 Den Bit-Komplement-Operator mit verschiedenenDatentypen nutzen 6
1.5 Auf einen geraden oder einen ungeraden Wert prüfen 8
1.6 Das High-Word oder Low-Word zu einer Zahl ermitteln 9
1.7 Eine Zahl zu einer anderen Basis in eine Zahlzur Basis 10 konvertieren 11
1.8 Ermitteln, ob ein String eine gültige Zahl ist 12
1.9 Einen Fließkommawert runden 13
1.10 Einen Rundungsalgorithmus wählen 13
1.11 Celsius in Fahrenheit konvertieren 15
1.12 Fahrenheit in Celsius konvertieren 15
1.13 Einen verkleinernden numerischen Cast sicher durchführen 16
1.14 Einen Enumerationswert als einen String anzeigen 19
1.15 Klartext in einen äquivalenten Enumerationswert umwandeln 21
1.16 Prüfen, ob ein Wert ein gültiger Enumerationswert ist 22
1.17 Auf eine gültige Enumeration von Flags prüfen 25
1.18 Enumerierte Member in einer Bit-Maske verwenden 27
1.19 Ermitteln, ob ein oder mehr Enumerations-Flags gesetzt sind 30
1.20 Den ganzzahligen Anteil eines decimal- oder double-Werts ermitteln 33
Strings und Zeichen 35
2.1 Die Art von Zeichen ermitteln, die ein char enthält 35
2.2 Beim Vergleich von zwei Zeichen die Berücksichtigung von Groß-/Kleinschreibung steuern 39
2.3 Die Positionen aller Vorkommen eines Strings in einem anderen String finden 41
2.4 Groß-/Kleinschreibung beim Vergleich von Strings steuern 45
2.5 Einen String mit dem Anfang oder dem Ende eines anderen Strings vergleichen 46
2.6 Einen Text in einen String einfügen 48
2.7 Zeichen in einen String einfügen oder aus ihm entfernen 49
2.8 Binäre Daten in Base64 kodieren 52
2.9 In Base64 kodierte Binärinformationen dekodieren 53
2.10 Einen String, der als byte[ ] zurückgeliefert wird, wieder in einen String umwandeln 54
2.11 Einen String an eine Methode übergeben, die nurein byte[ ] akzeptiert 55
2.12 Strings in andere Typen umwandeln 57
2.13 Einen begrenzten String erzeugen 61
2.14 Elemente aus einem begrenzten String herausziehen 62
2.15 Alle Zeichen in einem String durchlaufen 63
2.16 Zeichen vom Ende oder Anfang eines Strings abschneiden 64
2.17 Einen String darauf testen, ob er null oder leer ist 65
2.18 Eine Zeile anhängen 66
Klassen und Strukturen 68
3.1 Union-artige Strukturen erstellen 70
3.2 Einen Typ sortierbar machen 73
3.3 Einen Typ suchbar machen 78
3.4 Die Operatoren +=, -=, /= und *= indirekt überladen 83
3.6 Fehlerfreie Ausdrücke erstellen 89
3.7 Ihre Boolesche Logik minimieren (reduzieren) 92
3.8 Sprachunabhängig zwischen einfachen Typen konvertieren 95
3.9 Herausfinden, wann der Cast()-Operator, der as-Operator oder der is-Operator verwendet werden sollten 102
3.10 Mit dem as-Operator casten 103
3.11 Den Typ einer Variablen mit dem is-Operator ermitteln 106
3.12 Aus einer Methode mehrere Elemente zurückliefern 109
3.13 Kommandozeilenparameter parsen 111
3.14 Ein konstantes Feld zur Laufzeit initialisieren 120
3.15 Klonbare Klassen erstellen 123
3.16 Die Entsorgung eines Objekts sichern 126
3.17 Nicht-verwaltete Ressourcen entsorgen 129
3.18 Feststellen, wann Boxing und Unboxing durchgeführt wird 136
Generics 140
4.1 Entscheiden, wann und wo Generics verwendet werden sollten 140
4.2 Generische Typen verstehen 141
4.3 ArrayList durch das generische Gegenstück ersetzen 149
4.4 Stack und Queue durch ihre generischen Gegenstücke ersetzen 153
4.5 Eine verkette Liste (LinkedList) implementieren 158
4.6 Einen Werttyp erstellen, der auf null initialisiert werden kann 162
4.7 Den Inhalt einer SortedList umkehren 164
4.8 Schreibgeschützte generische Collections erstellen 192
4.9 Eine Hashtable durch das generische Gegenstück ersetzen 194
4.10 foreach mit generischen Dictionary-Typen verwenden 198
4.11 Typargumente beschränken 199
4.12 Generische Variablen auf ihre Default-Werte initialisieren 201
Collections 204
5.1 Zwei Elemente in einem Array tauschen 206
5.2 Ein Array schnell umkehren 208
5.3 Ermitteln, wie oft ein Element in einer List vorkommt 210
5.4 Alle Instanzen eines bestimmten Elements aus einer List abrufen 213
5.5 Elemente in ein Array einfügen und aus einem Array entfernen 217
5.6 Eine List sortiert halten 219
5.7 Die Schlüssel und/oder Werte eines Dictionary sortieren 222
5.8 Ein Dictionary mit Ober- und Untergrenzen für Werte erzeugen 225
5.9 Momentaufnahmen von Lists in Arrays speichern 228
5.10 Eine Collection zwischen Anwendungssessions erhalten 229
5.11 Alle Elemente in einem Array oder einer List testen 232
5.12 Eine Aktion auf jedem Element eines Arrays odereiner List durchführen 233
5.13 Ein schreibgeschütztes Array- oder List-Objekt erzeugen 235
Iteratoren und partielle Typen 238
6.1 In einer Klasse eine eingebettete foreach-Funktionalität implementieren 239
6.2 Eigene Enumeratoren erstellen 245
6.3 Auf einem generischen Typ einen Iterator implementieren 248
6.4 Auf einem nicht-generischen Typ einen Iterator erzeugen 251
6.5 Einem einzelnen Typ mehrere Iteratoren hinzufügen 252
6.6 Einen Iterator zwingen, die Iteration zu beenden 256
6.7 Mit Finally-Blöcken und Iteratoren klarkommen 257
6.8 Interface-Implementierungen organisieren 261
6.9 Code generieren, der sich nicht mehr im Haupt-Code-Pfad befindet 266
Exception-Handling 270
7.1 Wann sollten Exceptionen abgefangen und weitergereicht werden? 278
7.2 Sichern, dass Exceptions nicht verloren gehen, wenn Finally-Blöcke verwendet werden 279
7.3 Exceptions von Methoden verarbeiten, die über Reflection aufgerufen wurden 282
7.4 Unbehandelte Exceptions verhindern 285
7.5 Exception-Informationen erhalten 287
7.6 Einem Problem schnell auf den Grund gehen 291
7.7 Einen neuen Exception-Typ erzeugen 292
7.8 Einen Stacktrace erhalten 305
7.9 Bei einem ersten Auftreten einer Exception abbrechen 308
7.10 Exceptions verarbeiten, die von einem asynchronen Delegate ausgelöst werden 311
7.11 Exceptions mithilfe von Exception.Data mit zusätzlichen Informationen ausstatten 312
7.12 Mit unbehandelten Exceptions in WinForms-Anwendungen umgehen 314
Diagnose 317
8.1 Feinstufige Kontrolle über Debugging/Tracing-Ausgaben erhalten 318
8.2 Feststellen, ob ein Prozess nicht mehr reagiert 321
8.3 In einer Anwendung Event-Logs nutzen 323
8.4 Event-Log-Einträge durchsuchen 330
8.5 Das Event-Log auf einen bestimmten Eintrag überwachen 334
8.6 Einen einfachen Performance-Counter implementieren 335
8.7 Komplexen Tracing-Code aktivieren und deaktivieren 339
8.8 Die Standardausgabe eines Prozesses einfangen 343
8.9 Eigene Debugging-Anzeigen für Ihre Klasse erstellen 345
Delegates, Events und anonyme Methoden 348
9.1 Steuern, wann ein Delegate in einem Multicast-Delegate ausgelöst wird 349
9.2 Die Rückgabewerte aller Delegates in einem Multicast-Delegate erhalten 353
9.3 Exceptions separat für alle Delegates in einem Multicast-Delegate verarbeiten 355
9.4 Synchrone Delegate-Aufrufe in asynchrone umwandeln 359
9.5 Ein fortgeschrittener Suchmechanismus für Interfaces 362
9.6 Veränderungen an und Hinzufügungen zu einer Hashtable beobachten 366
9.7 Anonyme Methoden verwenden 374
9.8 Event-Handler sauber einrichten 379
9.9 In anonymen Methoden unterschiedliche Parameter-Modifier verwenden 383
9.10 In C# Closures verwenden 387
9.11 Mit Funktionsobjekten mehrere Operationenauf einer Liste durchführen 391
Reguläre Ausdrücke 396
10.1 Treffer enumerieren 397
10.2 Gruppen aus einer MatchCollection herausziehen 400
10.3 Die Syntax eines regulären Ausdrucks prüfen 404
10.4 Schnell nur den letzten Treffer in einem String finden 405
10.5 Die elementaren String-Ersetzungsfunktionen verstärken 406
10.6 Einen Tokenizer implementieren 409
10.7 Die Zeilen eines Texts zählen 411
10.8 Die gesamte Zeile zurückliefern, in der ein Treffer gefunden wird 414
10.9 Ein bestimmtes Vorkommen eines Treffers finden 418
10.10 Verbreitete Muster verwenden 420
Dateisystem-I/O 424
11.1 Datei-Attribute manipulieren 425
11.2 Eine Datei umbenennen 428
11.3 Ein plattformunabhängiges Zeilenende-Zeichen ausgeben 429
11.4 Verzeichnisattribute manipulieren 431
11.5 Ein Verzeichnis umbenennen 434
11.6 Mit Jokerzeichen nach Dateien oder Verzeichnissen suchen 435
11.7 Einen Verzeichnisbaum erhalten 440
11.8 Einen Pfad parsen 442
11.9 Pfade in Umgebungsvariablen parsen 444
11.10 Konsolenwerkzeuge starten und verwenden 446
11.11 Warten, dass im Dateisystem ein Ereignis eintritt 447
11.12 Die Versionsinformationen von zwei ausführbarenModulen vergleichen 450
11.13 Informationen zu allen Laufwerken auf einem System abfragen 453
11.14 Dateien komprimieren und dekomprimieren 456
Reflection 460
12.1 Referenzierte Assemblies auflisten 461
12.2 Exportierte Typen auflisten 463
12.3 Überschriebene Methoden ermitteln 464
12.4 In einer Assembly Member finden 470
12.5 Die eingebetteten Typen in einer Assembly ermitteln und abrufen 471
12.6 Die Vererbungshierarchie für einen Typ anzeigen 473
12.7 Die Unterklassen eines Typs ermitteln 475
12.8 Alle serialisierbaren Typen in einer Assembly finden 477
12.9 Member dynamisch aufrufen 479
12.10 Prüfen, ob ein Typ oder eine Methode generisch ist 483
12.11 Informationen zu lokalen Variablen erhalten 484
12.12 Einen generischen Typ erzeugen 487
Web 489
13.1 Eine IP-Adresse in einen Hostnamen umwandeln 489
13.2 Einen Hostnamen in eine IP-Adresse umwandeln 490
13.3 Einen URI parsen 491
13.4 Mit Webserver-Fehlern umgehen 495
13.5 Mit einem Webserver kommunizieren 497
13.6 Über einen Proxy gehen 499
13.7 Das HTML zu einer URL erhalten 501
13.8 Das neue WebBrowser-Steuerelement verwenden 502
13.9 Datenbank-Tabellen an den Cache binden 504
13.10 Eine ASP.NET-Website mittels Programmierung aufbauen 506
13.11 Daten für das Web maskieren 509
13.12 Die Klasse UriBuilder nutzen 511
13.13 Die Konfiguration Ihrer Webanwendung einsehen und ändern 514
13.14 Bei der Arbeit mit HTTP gecachte Ergebnisse verwenden 516
13.15 Die angepassten Fehlerseiten eines Webservers prüfen 518
XML 521
14.1 XML-Daten in Dokumentordnung lesen oder schreiben 522
14.2 Den Inhalt eines XML-Dokuments durchsuchen 526
14.3 XML validieren 528
14.4 Ein XML-Dokument über ein Programm aufbauen 534
14.5 Änderungen an einem XML-Dokument feststellen 536
14.6 Ungültige Zeichen in einem XML-String behandeln 539
14.7 XML transformieren 542
14.8 Modifizierte XML-Dokumente validieren, ohne sie neu zu laden 546
14.9 XSLT-Transformationen erweitern 549
14.10 Schemas aus vorhandenen XML-Dateien ableiten 553
14.11 XSLT-Transformationen Parameter übergeben 554
Netzwerk 559
15.1 Formulareingaben simulieren 559
15.2 Daten von einem Server herunterladen 563
15.3 Aus einem Programm heraus pingen 565
15.4 Über den SMPT-Dienst SMTP-Mails senden 567
15.5 Sockets nutzen, um die Ports auf einer Maschine zu scannen 572
15.6 Die aktuellen Internet-Verbindungseinstellungen nutzen 577
15.7 Über FTP eine Datei herunterladen 584
Sicherheit 586
16.1 Den Zugriff auf Typen in einer lokalen Assembly steuern 586
16.2 Einen String verschlüsseln und entschlüsseln 596
16.3 Eine Datei verschlüsseln und entschlüsseln 601
16.4 Kryptographische Informationen aufräumen 606
16.5 Prüfen, dass ein String bei einer Übertragung nicht beschädigt wurde 608
16.6 Daten sicher speichern 612
16.7 Eine Sicherheitszusicherung absichern 619
16.8 Prüfen, dass einer Assembly bestimmte Berechtigungen verliehen wurden 622
16.9 Die Angriffsfläche einer Assembly minimieren 623
16.10 Sicherheits/Audit-Informationen erhalten 624
16.11 Zugriff auf eine Datei oder einen Registrierungsschlüssel gestatten bzw. widerrufen 630
16.12 Stringdaten mit sicheren Strings absichern 633
16.13 web.config-Informationen verschlüsseln 636
16.14 Den vollständigen Grund dafür erhalten, dass eine SecurityException ausgelöst wurde 638
16.15 Sichere Unicode-Kodierung erreichen 640
16.16 Ein sichereres Datei-Handle erhalten 642
Threading und Synchronisierung 644
17.1 Thread-gebundene statische Felder erzeugen 644
17.2 Thread-sicheren Zugriff auf Klassen-Member bieten 647
17.3 Stillschweigende Thread-Beendigung verhindern 653
17.4 Thread-spezifische Daten privat speichern 656
17.5 Über Semaphore Mehrfachzugriff auf Ressourcen bieten 659
17.6 Mehrere Prozesse mit einem Mutex synchronisieren 664
17.7 Events für die Thread-Kooperation einsetzen 676
17.8 Benannte Events einsetzen 678
17.9 Atomare Operationen zwischen Threads durchführen 682
Werkzeugkasten 685
18.1 Mit dem Herunterfahren des Betriebssystems, dem Power Management oder Änderungen der Benutzersitzungen arbeiten 685
18.2 Einen Dienst steuern 690
18.3 Die Prozesse auflisten, in denen eine Assembly geladen ist 694
18.4 Message-Queues auf der lokalen Arbeitsstation verwenden 695
18.5 Den Pfad zur aktuellen Version des Frameworks finden 699
18.6 Die Versionen einer Assembly ermitteln, die imGlobal Assembly Cache (GAC) registriert sind 699
18.7 Die Standardausgabe einfangen 702
18.8 Code in seiner eigenen AppDomain ausführen 704
18.9 Die Betriebssystem- und Service-Pack-Version des aktuellen Betriebssystems ermitteln 706
Index 709