Jeffrey Richter (Wintellect) Microsoft.NET Framework- Programmierung mit C# Zweite Ausgabe Mit einem Vorwort von Aidan Richter Microsoft
Inhaltsverzeichnis Vorwort 15 Einführung 17 Die Entwicklungsplattform: Das.NET Framework 18 Die Entwicklungsumgebung: Microsoft Visual Studio 22 Ziel dieses Buchs 22 Beispielcode und Systemvoraussetzungen 23 Dieses Buch ist perfekt 23 Danksagungen 23 Support 24 Teil I Die Grundlagen der CLR 25 1 Das Ausführungsmodell der CLR 27 Quellcode in verwaltete Module kompilieren 27 Verwaltete Module in Assemblys kombinieren 30 Laden der Common Language Runtime 32 Ausfuhren des Codes in der Assembly 35 IL und Überprüfung 40 Unsicherer Code 41 Nativen Code generieren: das Tool NGen.exe 43 Einführung in die Framework Class Library 45 Das Common Type System 47 Die Common Language Specification 49 Interoperabilität mit nicht verwaltetem Code 54 2 Anwendungen und Typen erstellen, verpacken, bereitstellen und administrieren 57 Ziele der.net Framework-Bereitstellung 58 /Typen erstellen und in Modulen zusammenfassen 59 Antwortdateien 60 /' Ein kurzer Blick auf die Metadaten 62 r Module zu einer Assembly zusammenfassen 69.NET-Assemblys in der Visual Studio-IDE zu einem Projekt hinzufügen 75 Der Assemblylinker 76 Ressourcendateien in die Assembly aufnehmen 77 Versionsinformationen über eine Assembly 78 Versionsnummern 80 Kultur 81 Einfache Anwendungsbereitstellung 82 Einfache Administration 84
8 Inhaltsverzeichnis 3 Gemeinsam genutzte Assemblys und Assemblys mit starken Namen 89 Zwei Arten von Assemblys, zwei Arten der Bereitstellung 91 Assemblys einen starken Namen geben 92 Der globale Assemblycache 97 Die interne Struktur des globalen Assemblycaches 101 Erstellen einer Assembly, die auf eine Assembly mit starkem Namen verweist 104 Assemblys mit starken Namen sind fälschungssicher 105 Verzögertes Signieren 106 Assemblys mit starken Namen privat bereitstellen 108 Wie die CLR Typverweise auflöst 109 Fortgeschrittene Administration 112 Herausgeberrichtlinien 114 Teil II Arbeiten mit Typen 119 4 Die Grundlagen von Typen '. 121 Alle Typen sind von System.Object abgeleitet 121 Typkonvertierung 123 Typkonvertierung mit den C#-Operatoren is und as 125 Namespaces und Assemblys 126 Abläufe während der Laufzeit 131 5 Primitive Typen, Verweistypen, Werttypen 141 Primitive Typen in der Programmiersprache 141 Überprüfte und nicht überprüfte Operationen mit primitiven Typen 144 Verweistypen und Werttypen 147 Boxing und Unboxing von Werttypen 152 Ändern von Feldern in einem geschachtelten Werttyp mithilfe von Schnittstellen (und warum Sie darauf verzichten sollten) 164 Gleichheit und Identität von Objekten 166 Hashcodes von Objekten 169 Teil III Entwerfen von Typen 173 6 Die Grundlagen von Typen und Membern 175 Die unterschiedlichen Arten von Typmembern 175 Sichtbarkeit von Typen 178 ' Friend-Assemblys 179 Zugriffsmodifizierer für Member 180 Statische Klassen 182 Partielle Klassen, Strukturen und Schnittstellen 183 Komponenten, Polymorphie und Versionsverwaltung 184 Wie die CLR virtuelle Methoden, Eigenschaften und Ereignisse aufruft 187 Tipps zum Festlegen der Sichtbarkeit von Typen und der Zugriffsebene von Membern 191 Virtuelle Methoden und Versionsverwaltung von Typen 194
Inhaltsverzeichnis 9 7 Konstanten und Felder 199 Konstanten 199 Felder ". 200 8 Methoden: Konstruktoren, Operatoren, Typumwandlung und Parameter 205 Instanzkonstruktoren bei Klassen (Verweistypen) 205 Instanzkonstruktoren bei Strukturen (Werttypen) 208 Typkonstruktoren 211 Leistungsaspekte bei Typkonstruktoren 214 Methoden zum Überladen von Operatoren 217 Operatoren und die Interoperabilität von Programmiersprachen 219 Methoden" für Konvertierungsoperatoren.. : 220 Argumente als Verweise an eine Methode übergeben 223 Methoden mit einer variablen Anzahl von Parametern 228 Deklarieren der Parametertypen bei einer Methode 231 Konstante Methoden und Parameter 232 9 Eigenschaften 235 Parameterlose Eigenschaften 235 Eigenschaften geschickt definieren 239 Eigenschaften mit Parametern 240 Leistungsaspekte beim Aufruf der Accessormethoden von Eigenschaften 245 Zugriffsebenen bei Eigenschaftsaccessoren 245 Generische Accessormethoden für Eigenschaften 246 10 Ereignisse 247 Einen Typ entwerfen, der ein Ereignis anbietet 248 Schritt 1: Definieren Sie einen Typ für all die zusätzlichen Informationen, die an die Empfänger des Ereignisses geschickt werden sollen 249 Schritt 2: Definieren Sie das Ereignismember 249 Schritt 3: Definieren Sie eine Methode, die das Ereignis auslöst, damit die registrierten Objekte benachrichtigt werden, dass das Ereignis eingetreten ist... 251 Schritt 4: Definieren Sie eine Methode, die die Eingaben in das gewünschte Ereignis umsetzt 252 Wie Ereignisse implementiert sind 252 Einen Typ entwerfen, der ein Ereignis empfängt 254 Ereignisse und Threadsicherheit 256 Das An- und Abmelden von Ereignisempfängern explizit steuern 257 Typen entwickeln, die viele Ereignisse definieren 259 Teil IV Wichtige Typen 261 11 Zeichen, Strings und Arbeiten mit Text 263 Zeichen 263 Der Typ System.String 266 Anlegen von Strings 266 Strings sind unveränderlich 268
10 Inhaltsverzeichnis Vergleichen von Strings 269 String-Interning 274 String-Pooling 278 Die Zeichen und Textelemente innerhalb eines Strings untersuchen 278 Sonstige Stringoperationen 280 Einen String effizient zusammenstellen 281 Anlegen eines StringBuilder-Objekts 282 Die Member von StringBuilder 282 Stringdarstellungen für ein Objekt 284 Bestimmte Formate und Kulturen 285 Mehrere Objekte in einem einzigen String formatieren 289 Benutzerdefinierte Formatierung 290 Ein Objekt aus dessen Stringdarstellung extrahieren 293 Zeichenkodierung: Konvertieren zwischen Zeichen und Bytes 295 Kodieren und Dekodieren von Zeichen- und Bytestreams 300 Kodieren und Dekodieren von Base-64-Strings 301 Sichere Strings 302 12 Enumerationstypen und Bitflags 305 Enumerationstypen 305 Bitflags 310 13 Arrays 315 Typkonvertierung bei Arrays 317 Alle Arrays sind implizit von System.Array abgeleitet 320 Alle Arrays implementieren implizit IEnumerable, ICollection und IList 320 Arrays als Parameter und Rückgabewerte 321 Arrays mit einem Startindex ungleich null 322 Leistungsaspekte beim Arrayzugriff 323 Unsicherer Arrayzugriff und eingebettete Arrays 328 14 Schnittstellen 331 Klassen- und Schnittstellenvererbung 331 Definieren einer Schnittstelle 332 Schnittstellenvererbung 334 Mehr über das Aufrufen von Schnittstellenmethoden 336 Implizite und explizite Implementierungen von Schnittstellenmethoden (was hinter den Kulissen passiert) 337 öenerische Schnittstellen 339 Einschränkungen für Generika in Schnittstellen 341 Implementieren mehrerer Schnittstellen, die Methoden mit demselben Namen und derselben Signatur haben 342 Verbessern der Typsicherheit beim Kompilieren mit expliziter Implementierung von Schnittstellenmethoden 343 Vorsicht bei expliziten Schnittstellenmethodenimplementierungen 345 Entwurfsfragen: Basisklasse oder Schnittstelle? 347
Inhaltsverzeichnis 11 15 Delegaten 351 Ein erster Blick auf Delegaten 351 Rückrufe in statische Methoden '. 354 Rückrufe in Instanzmethoden 355 Delegaten enträtselt 356 Rückrufe in mehrere Methoden (Verkettung) 360 Delegatenketten in C# 364 Einzelne Elemente einer Delegatenkette aufrufen 365 Syntaxerleichterungen für das Arbeiten mit Delegaten in C# 367 Syntaxabkürzung 1: Es braucht kein Delegatobjekt angelegt zu werden 367 Syntaxabkürzung 2: Es braucht keine Rückrufmethode definiert zu werden 368 Syntaxabkürzung 3: Es brauchen keine Parameter für die Rückrufmethode definiert zu werden 370 Syntaxabkürzung 4: Lokale Variablen brauchen nicht von Hand in eine Klasse verpackt zu werden, um sie an eine Rückrufmethode zu übergeben 370 Delegaten und Reflektion 373 16 Generika 377 Generika in der Framework Class Library 382 Die Power Collections Library von Wintellect 383 Infrastruktur von Generika 384 Offene und geschlossene Typen 385 Generische Typen und Vererbung 387 Identität von generischen Typen 388 Explosive Codevermehrung 389 Generische Schnittstellen 390 Generische Delegaten 391 Generische Methoden 392 Generische Methoden und Typherleitung 393 Generika für andere Member 394 Überprüfbarkeit und Einschränkungen 394 Primäre Einschränkungen 397 Sekundäre Einschränkungen 398 /? Konstruktoreinschränkungen 399 Andere Überprüfbarkeitsprobleme 400 17/ Benutzerdefinierte Attribute 403 Benutzerdefinierte Attribute einsetzen 404 Definieren eigener Attributklassen 407 Datentypen für Konstruktor, Felder und Eigenschaften von Attributen 410 Benutzerdefinierte Attribute auswerten 412 Zwei Attributinstanzen miteinander vergleichen 416 Benutzerdefinierte Attribute untersuchen, ohne von Attribute abgeleitete Objekte anzulegen 418 Klassen für bedingte Attribute 421
12 Inhaltsverzeichnis 18 Nullable-Werttypen 423 Nullable-Werttypen in C# 425 Der Operator ff in C# 426 Spezielle Unterstützung für Nullable-Werttypen in der CLR 427 Boxing von Nullable-Werttypen 427 Unboxing von Nullable-Werttypen 427 GetType für einen Nullable- Werttyp aufrufen 429 Schnittstellenmethoden über einen Nullable-Werttyp aufrufen 429 Teil V Die Infrastruktur der CLR 431 19 Ausnahmen '.".-..' 433 Die Evolution der Ausnahmebehandlung 434 Die Funktionsweise der Ausnahmebehandlung 436 Der fry-block 437 Der catch-block 437 Der/ma/Zy-Block 439 CLS-kompatible und nicht CLS-kompatible Ausnahmen 440 Was genau ist eine Ausnahme? 441 Die Klasse System.Exception 443 Ausnahmeklassen in der FCL 444 Auslösen einer Ausnahme 447 Definieren einer eigenen Ausnahmeklasse 447 Wie Sie Ausnahmen richtig einsetzen 451 Überprüfen Sie die Argumente Ihrer Methode 451 Sie können gar nicht genug/ina//j-blöcke haben 454 Fangen Sie nicht alles ab 455 Nach dem Abfangen einer Ausnahme die Situation bereinigen 456 Eine teilweise ausgeführte Operation abbrechen 457 Verstecken von Implementierungsdetails 458 Leistungsaspekte 460 Unbehandelte Ausnahmen 463 Stackabbilder nach Ausnahmen 465 Ausnahmen d buggen 467 20 Automatische Speicherverwaltung 471 Arbeiten^uf einer Plattform mit automatischer Speicherverwaltung 471 Ressourcen vom verwalteten Heap anfordern 473 Der Garbage Collection-Algorithmus 475 Garbage Collections und Debugging 479 Verwenden des Objektabschlusses zum Freigeben nativer Ressourcen 481 Garantierter Abschluss mithilfe von CriticalFinalizerObject-Typen 483 SafeHandle und davon abgeleitete Typen 484 Zusammenarbeit mit nicht verwaltetem Code mithilfe von SafeHandle-Typen... 486 Abschluss für verwaltete Ressourcen 488
Inhaltsverzeichnis 13 Wann werden Finafee-Methoden aufgerufen? 491 Interna des Objektabschlusses 492 Das Beseitigungsmuster: Ein Objekt zum Aufräumen zwingen 495 Einen Typ benutzen, der das Beseitigungsmuster implementiert 499 Die C#-Anweisung using 502 Ein interessantes Abhängigkeitsproblem 504 Die Lebensdauer von Objekten überwachen und von Hand steuern 505 Wiederbelebung 513 Generationen 515 Weitere Garbage Collection-Features für den Umgang mit nativen Ressourcen 520 Den Erfolg einer Operation vorhersagen, die viel Speicher braucht 524 Den Garbage Collector vom Code aus steuern 525 Weitere Leistungsaspekte des Garbage Collectors 528 Synchronisierungsfreie Objekterstellung 529 Skalierbare parallele Garbage Collections 529 Garbage Collection im Hintergrund 530 Große Objekte 531 Garbage Collections überwachen 531 21 CLR-Hosting und AppDomains 533 CLR-Hosting 533 AppDomains 537 Über AppDomain-Grenzen hinweg auf Objekte zugreifen 539 Entladen einer AppDomain 550 Wie Hosts AppDomains benutzen 551 Konsolen- und Windows Forms-Anwendungen 551 Microsoft Internet Explorer 551 Microsoft ASP.NET-Web Forms- und XML-Webdienstanwendungen 552 Microsoft SQL Server 2005 552 Die Zukunft und Ihre eigene Vorstellungskraft 553 Erweiterte Hoststeuerung 553 Die CLR mit verwaltetem Code verwalten 553 Eine robuste Hostanwendung schreiben 554 /> Wie ein Host seinen Thread zurückbekommt 555 / 22 Laden von Assemblys und Reflektion 559 f Laden von Assemblys 559 Mithilfe der Reflektion eine dynamisch erweiterbare Anwendung erstellen 563 Leistungsaspekte bei der Reflektion 564 Ermitteln, welche Typen in einer Assembly definiert sind 565 Was genau ist ein Typobjekt? 565 Erstellen einer Hierarchie aller Typen, die von Exception abgeleitet sind 567 Eine Instanz eines Typs anlegen 569 Entwerfen einer Anwendung, die Add-Ins unterstützt 572 Mithilfe der Reflektion die Member eines Typs ermitteln 574 Die Member eines Typs ermitteln 575