Vorwort 21
Teil I C# 1.0 23
1 Einführung 25
1.1 Hallo, Welt 26
1.2 Die Programmstruktur 27
1.3 Typen und Variablen 29
1.4 Ausdrücke 33
1.5 Anweisungen 35
1.6 Klassen und Objekte 39
1.6.1 Member 40
1.6.2 Zugriffsmodifizierer 41
1.6.3 Basisklassen 41
1.6.4 Felder 42
1.6.5 Methoden 43
1.6.6 Andere Funktionsmember 51
1.7 Strukturen (structs) 56
1.8 Arrays 58
1.9 Interfaces 60
1.10 Aufzählungen 61
1.11 Delegates 63
1.12 Attribute 64
2 Die lexikalische Struktur 67
2.1 Programme 67
2.2 Grammatik 67
2.2.1 Schreibweisen 68
2.2.2 Lexikalische Grammatik 69
2.2.3 Syntaktische Grammatik 69
2.3 Lexikalische Analyse 69
2.3.1 Zeilenendezeichen 70
2.3.2 Leerraum 71
2.3.3 Kommentare 71
2.4 Textelemente 73
2.4.1 Escape-Sequenzen für Unicode-Zeichen (Maskierung) 73
2.4.2 Bezeichner 74
2.4.3 Schlüsselwörter 76
2.4.4 Literale 77
2.4.5 Operatoren und Trennzeichen 84
2.5 Präprozessor-Direktiven 84
2.5.1 Symbole für die bedingte Kompilierung 85
2.5.2 Präprozessor-Ausdrücke 86
2.5.3 Deklarationsdirektiven 87
2.5.4 Direktiven für die bedingte Kompilierung 88
2.5.5 Diagnosedirektiven 92
2.5.6 Abschnittsdirektiven 92
2.5.7 Zeilendirektiven 93
3 Grundbegriffe 95
3.1 Anwendungsstart 95
3.2 Anwendungsende 97
3.3 Deklarationen 97
3.4 Member 100
3.4.1 Namespace-Member 100
3.4.2 Strukturmember 101
3.4.3 Aufzählungsmember 101
3.4.4 Klassenmember 101
3.4.5 Interface-Member 102
3.4.6 Array-Member 102
3.4.7 Delegate-Member 102
3.5 Memberzugriff 102
3.5.1 Zugriffsdeklaration 102
3.5.2 Zugriffsdomänen 104
3.5.3 Geschützter Zugriff für Instanzmember 107
3.5.4 Zugriffseinschränkungen 108
3.6 Signaturen und Überladung 109
3.7 Gültigkeitsbereiche 110
3.7.1 Verbergen von Namen 113
3.8 Namespace- und Typnamen 116
3.8.1 Vollständig qualifizierte Namen 118
3.9 Automatische Speicherverwaltung 119
3.10 Ausführungsreihenfolge 122
4 Typen 125
4.1 Wertetypen 126
4.1.1 Der Typ System.ValueType 127
4.1.2 Standardkonstruktoren 127
4.1.3 Strukturtypen 128
4.1.4 Einfache Typen 128
4.1.5 Integrierte Typen 129
4.1.6 Fließkommatypen 131
4.1.7 Der Datentyp decimal 133
4.1.8 Der Datentyp bool 134
4.1.9 Aufzählungstypen 134
4.2 Verweistypen 134
4.2.1 Klassentypen 135
4.2.2 Der Datentyp object 136
4.2.3 Der Datentyp string 136
4.2.4 Interface-Typen 136
4.2.5 Array-Typen 137
4.2.6 Delegate-Typen 137
4.3 Boxing und Unboxing 137
4.3.1 Boxing 137
4.3.2 Unboxing 139
5 Variablen 141
5.1 Kategorien von Variablen 141
5.1.1 Statische Variablen 142
5.1.2 Instanzvariablen 142
5.1.3 Array-Elemente 143
5.1.4 Werteparameter 143
5.1.5 Verweisparameter 143
5.1.6 Ausgabeparameter 144
5.1.7 Lokale Variablen 144
5.2 Standardwerte 145
5.3 Eindeutige Zuweisung 146
5.3.1 Ursprünglich zugewiesene Variablen 147
5.3.2 Ursprünglich nicht zugewiesene Variablen 147 5.3.3 Regeln zum Bestimmen der eindeutigen Zuweisung 148
5.4 Variablenreferenz 160 5.5 Die Unteilbarkeit von Variablenreferenzen 161
6 Konvertierungen 163
6.1 Implizite Konvertierungen 163
6.1.1 Identitäts-Konvertierung 164
6.1.2 Implizite numerische Konvertierung 164
6.1.3 Implizite Aufzählungskonvertierungen 165
6.1.4 Implizite Referenzkonvertierungen 165
6.1.5 Boxing 165
6.1.6 Implizite Konvertierungen konstanter Ausdrücke 166 6.1.7 Benutzerdefinierte implizite Konvertierungen 166
6.2 Explizite Konvertierungen 166
6.2.1 Explizite numerische Konvertierungen 167
6.2.2 Explizite Aufzählungskonvertierungen 169
6.2.3 Explizite Referenzkonvertierungen 170
6.2.4 Unboxing 170
6.2.5 Benutzerdefinierte explizite Konvertierungen 171
6.3 Standardkonvertierungen 171
6.3.1 Standardmäßige implizite Konvertierungen 171 6.3.2 Standardmäßige explizite Konvertierungen 171
6.4 Benutzerdefinierte Konvertierungen 171
6.4.1 Zulässige benutzerdefinierte Konvertierungen 172 6.4.2 Auswertung von benutzerdefinierten Konvertierungen 172 6.4.3 Implizite benutzerdefinierte Konvertierungen 174 6.4.4 Explizite benutzerdefinierte Konvertierungen 175
7 Ausdrücke 177
7.1 Klassifizierung von Ausdrücken 177
7.1.1 Werte von Ausdrücken 179
7.2 Operatoren 179
7.2.1 Vorrang und Orientierung 180
7.2.2 Überladen von Operatoren 181
7.2.3 Überladungsauflösung für unäre Operatoren 183 7.2.4 Überladungsauflösung für binäre Operatoren 183
7.2.5 Benutzerdefinierte Operatorkandidaten 184
7.2.6 Numerische Erweiterung 184
7.3 Membersuche 186
7.3.1 Basistypen 187
7.4 Funktionsmember 188
7.4.1 Argumentlisten 191
7.4.2 Überladungsauflösung 195
7.4.3 Aufruf von Funktionsmembern 197
7.5 Primäre Ausdrücke 200
7.5.1 Literale 200
7.5.2 Einfache Bezeichner 201
7.5.3 Geklammerte Ausdrücke 203
7.5.4 Memberzugriff 203
7.5.5 Aufrufausdrücke 206
7.5.6 Elementzugriff 209
7.5.7 this-Zugriff 211
7.5.8 base-Zugriff 212
7.5.9 Inkrement- und Dekrement-Postfixoperatoren 213
7.5.10 Der Operator new 214
7.5.11 Der Operator typeof 221
7.5.12 Die Operatoren checked und unchecked 222
7.6 Unäre Operatoren 225
7.6.1 Der unäre Plus-Operator 226
7.6.2 Der unäre Minus-Operator 226
7.6.3 Der Operator für die logische Negation 227
7.6.4 Der Operator für das bitweise Komplement 227 7.6.5 Die Inkrement- und Dekrement-Präfixoperatoren 228
7.6.6 Konvertierungsausdrücke 229
7.7 Arithmetische Operatoren 230
7.7.1 Der Multiplikationsoperator 230
7.7.2 Der Divisionsoperator 231
7.7.3 Der Restoperator 233
7.7.4 Der Additionsoperator 234
7.7.5 Der Subtraktionsoperator 236
7.8 Verschiebeoperatoren 239
7.9 Relationale Operatoren und Operatoren für
die Typüberprüfung 241
7.9.1 Integer-Vergleichsoperatoren 242
7.9.2 Fließkomma-Vergleichsoperatoren 242
7.9.3 Dezimale Vergleichsoperatoren 243
7.9.4 Boolesche Gleichheitsoperatoren 243
7.9.5 Aufzählungs-Vergleichsoperatoren 244
7.9.6 Verweistyp-Gleichheitsoperatoren 244
7.9.7 String-Gleichheitsoperatoren 246
7.9.8 Delegate-Gleichheitsoperatoren 246
7.9.9 Der Operator is 247
7.9.10 Der Operator as 248
7.10 Logische Operatoren 248
7.10.1 Logische Operatoren für Integer-Typen 249
7.10.2 Logische Operatoren für Aufzählungen 249
7.10.3 Boolesche logische Operatoren 250
7.11 Logische Bedingungsoperatoren 250
7.11.1 Boolesche logische Bedingungsoperatoren 251 7.11.2 Benutzerdefinierte logische Bedingungsoperatoren 2517.12 Der Bedingungsoperator 252
7.13 Zuweisungsoperatoren 253
7.13.1 Einfache Zuweisung 254
7.13.2 Zusammengesetzte Zuweisung 256
7.13.3 Ereigniszuweisung 257
7.14 Ausdrücke 258
7.15 Konstante Ausdrücke 258
7.16 Boolesche Ausdrücke 259
8 Anweisungen 261
8.1 Endpunkte und Erreichbarkeit 262
8.2 Blöcke 264
8.2.1 Anweisungslisten 265
8.3 Die leere Anweisung 265
8.4 Benannte Anweisungen 266
8.5 Deklarationsanweisungen 267
8.5.1 Deklaration lokaler Variablen 267
8.5.2 Deklaration lokaler Konstanten 268
8.6 Ausdrucksanweisungen 269
8.7 Auswahlanweisungen 269
8.7.1 Die Anweisung if 270
8.7.2 Die Anweisung switch 271
8.8 Iterationsanweisungen 275
8.8.1 Die Anweisung while 275
8.8.2 Die Anweisung do 276
8.8.3 Die Anweisung for 277
8.8.4 Die Anweisung foreach 279
8.9 Sprunganweisungen 281
8.9.1 Die Anweisung break 282
8.9.2 Die Anweisung continue 283
8.9.3 Die Anweisung goto 284
8.9.4 Die Anweisung return 285
8.9.5 Die Anweisung throw 286
8.10 Die Anweisung try 287
8.11 Die Anweisungen checked und unchecked 291
8.12 Die Anweisung lock 292
8.13 Die Anweisung using 293
9 Namespaces 297
9.1 Kompilierungseinheiten 297
9.2 Namespace-Deklarationen 298
9.3 using-Direktiven 300
9.3.1 Alias-using-Direktiven 300
9.3.2 Namespace-using-Direktiven 303
9.4 Namespace-Member 305
9.5 Typdeklarationen 306
10 Klassen 307
10.1 Klassendeklarationen 307
10.1.1 Klassenmodifizierer 307
10.1.2 Basisspezifikation 309
10.1.3 Der Klassenrumpf 311
10.2 Klassenmember 311
10.2.1 Vererbung 313
10.2.2 Der Modifizierer new 314
10.2.3 Zugriffsmodifizierer 314
10.2.4 Konstituierende Typen 315
10.2.5 Statische und Instanzmember 315
10.2.6 Verschachtelte Typen 316
10.2.7 Reservierte Membernamen 320
10.3 Konstanten 322
10.4 Felder 325
10.4.1 Statische und Instanzenfelder 326
10.4.2 Schreibgeschützte Felder 327
10.4.3 Flüchtige Felder 328
10.4.4 Initialisierung von Feldern 330
10.4.5 Variableninitialisierer 330
10.5 Methoden 334
10.5.1 Methodenparameter 336
10.5.2 Statische und Instanzmethoden 343
10.5.3 Virtuelle Methoden 344
10.5.4 Überschriebene Methoden 346
10.5.5 Versiegelte Methoden 348
10.5.6 Abstrakte Methoden 349
10.5.7 Externe Methoden 351
10.5.8 Der Methodenrumpf 352
10.5.9 Überladen von Methoden 352
10.6 Eigenschaften 353
10.6.1 Statische und Instanzeigenschaften 354
10.6.2 Zugriffsmethoden 355
10.6.3 Virtuelle, versiegelte, überschriebene und
abstrakte Zugriffsmethoden 361
10.7 Ereignisse 363
10.7.1 Feldähnliche Ereignisse 365
10.7.2 Ereignis-Zugriffsmethoden 367
10.7.3 Statische und Instanzereignisse 369
10.7.4 Virtuelle, versiegelte, überschriebene und
abstrakte Zugriffsmethoden 369
10.8 Indexer 370
10.8.1 Überladen von Indexern 375
10.9 Operatoren 375
10.9.1 Unäre Operatoren 376
10.9.2 Binäre Operatoren 378
10.9.3 Konvertierungsoperatoren 378
10.10 Instanzkonstruktoren 380
10.10.1 Konstruktorinitialisierer 381
10.10.2 Initialisierer für Instanzvariablen 382
10.10.3 Die Ausführung von Konstruktoren 383
10.10.4 Standardkonstruktoren 385
10.10.5 Private Konstruktoren 385
10.10.6 Optionale Parameter für Instanzkonstruktoren 386
10.11 Statische Konstruktoren 386
10.12 Destruktoren 389
11 Strukturen 393
11.1 Strukturdeklarationen 394
11.1.1 Strukturmodifizierer 394
11.1.2 Struktur-Interfaces 394
11.1.3 Strukturrumpf 395
11.2 Strukturmember 395
11.3 Unterschiede zwischen Klassen und Strukturen 395
11.3.1 Wertesemantik 396
11.3.2 Vererbung 397
11.3.3 Zuweisung 397
11.3.4 Standardwerte 397
11.3.5 Boxing und Unboxing 398
11.3.6 Die Bedeutung von this 399
11.3.7 Feldinitialisierer 399
11.3.8 Konstruktoren 399
11.3.9 Destruktoren 400
11.4 Beispiele für Strukturen 400
11.4.1 Der Integer-Datenbanktyp 401
11.4.2 Der boolesche Datenbanktyp 403
12 Arrays 405
12.1 Array-Typen 406
12.1.1 Der Typ System.Array 407
12.2 Erstellen von Arrays 407
12.3 Zugriff auf Array-Elemente 407
12.4 Array-Member 407
12.5 Kovarianz von Arrays 408
12.6 Array-Initialisierer 409
13 Interfaces 411
13.1 Interface-Deklarationen 411
13.1.1 Interface-Modifizierer 412
13.1.2 Basis-Interfaces 412
13.1.3 Interface-Rumpf 413
13.2 Interface-Member 413
13.2.1 Interface-Methoden 415
13.2.2 Interface-Eigenschaften 415
13.2.3 Interface-Ereignisse 415
13.2.4 Interface-Indexer 416
13.2.5 Zugriff auf Interface-Member 416
13.3 Vollständig qualifizierte Namen von Interface-Membern 418
13.4 Interface-Implementierungen 419
13.4.1 Explizite Implementierung von Interface-Membern 420
13.4.2 Interface-Zuordnung 422
13.4.3 Vererbung der Interface-Implementierung 426
13.4.4 Reimplementierung von Interfaces 427
13.4.5 Abstrakte Klassen und Interfaces 429
14 Aufzählungen 431
14.1 Aufzählungsdeklarationen 431
14.2 Aufzählungsmodifizierer 432
14.3 Aufzählungsmember 433
14.4 Der Typ System.Enum 435
14.5 Werte und Operationen von Aufzählungen 436
15 Delegates 437
15.1 Delegate-Deklarationen 438
15.2 Instanzierung von Delegates 440
15.3 Aufrufen von Delegates 441
16 Exceptions (Ausnahmen) 445
16.1 Gründe für Exceptions 445
16.2 Die Klasse System.Exception 446
16.3 Handhabung von Exceptions 446
16.4 Gebräuchliche Exceptionklassen 447
17 Attribute 449
17.1 Attributklassen 449
17.1.1 Attributverwendung 450
17.1.2 Positionale und benannte Parameter 451
17.1.3 Typen der Attributparameter 452
17.2 Attributspezifikation 452
17.3 Attributinstanzen 458
17.3.1 Kompilieren eines Attributs 458
17.3.2 Abruf einer Attributinstanz zur Laufzeit 459
17.4 Reservierte Attribute 459
17.4.1 Das Attribut AttributeUsage 460
17.4.2 Das Attribut Conditional 460
17.4.3 Das Attribut Obsolete 463
17.5 Attribute für die Interoperabilität 465
17.5.1 Interoperabilität mit COM- und Win32-Komponenten 465 17.5.2 Interoperabilität mit anderen .NET-Sprachen 46518 Unsicherer Code 467
18.1 Unsicherer Kontext 468
18.2 Zeigertypen 471
18.3 Feste und bewegliche Variablen 474
18.4 Zeigerkonvertierung 475
18.5 Zeiger in Ausdrücken 477
18.5.1 Zeigerindirektion 477
18.5.2 Zeigermemberzugriff 478
18.5.3 Zeigerelementzugriff 479
18.5.4 Der Operator address-of 480
18.5.5 Zeigerinkrement und -dekrement 481
18.5.6 Zeigerarithmetik 481
18.5.7 Zeigervergleiche 482
18.5.8 Der Operator sizeof 483
18.6 Die Anweisung fixed 484
18.7 Stack-Zuweisung 488
18.8 Dynamische Speicherzuweisung 489
Teil II C# 2.0 493
19 Einführung in C# 2.0 495
19.1 Generics 496
19.1.1 Wozu Generics? 496
19.1.2 Erstellen und Verwenden von Generics 497
19.1.3 Instanziieren generischer Typen 499
19.1.4 Einschränkungen 499
19.1.5 Generische Methoden 502
19.2 Anonyme Methoden 503
19.2.1 Konvertierung von Methodengruppen 506
19.3 Iteratoren 506
19.4 Partielle Typen 511
19.5 Nullable Types 512
20 Generics 517
20.1 Deklaration generischer Klassen 517
20.1.1 Typparameter 518
20.1.2 Der Instanztyp 520
20.1.3 Die Basisspezifikation 520
20.1.4 Member generischer Klassen 521
20.1.5 Statische Felder in generischen Klassen 522 20.1.6 Statische Konstruktoren in generischen Klassen 523 20.1.7 Zugriff auf geschützte (protected) Member 523
20.1.8 Überladen in generischen Klassen 524
20.1.9 Parameter-Array-Methoden und Typparameter 525
20.1.10 Überschreiben in generischen Klassen 525
20.1.11 Operatoren in generischen Klassen 526
20.1.12 Verschachtelte Typen in generischen Klassen 528
20.1.13 Der Eintrittspunkt einer Anwendung 528
20.2 Deklaration generischer Strukturen 529 20.3 Deklaration generischer Interfaces 529
20.3.1 Eindeutigkeit implementierter Interfaces 529 20.3.2 Explizite Implementierung von Interface-Membern 53120.4 Deklaration generischer Delegates 531
20.5 Konstruierte Typen 532
20.5.1 Typargumente 533
20.5.2 Offene und geschlossene Typen 534
20.5.3 Basisklassen und -Interfaces eines konstruierten Typs 534
20.5.4 Member eines konstruierten Typs 535
20.5.5 Zugriff auf einen konstruierten Typ 536
20.5.6 Konvertierungen 536
20.5.7 Aliase 537
20.5.8 Attribute 538
20.5.9 Arrays und das generische Interface IList 538
20.6 Generische Methoden 539
20.6.1 Signaturen generischer Methoden 540
20.6.2 Virtuelle generische Methoden 541
20.6.3 Aufrufen generischer Methoden 543
20.6.4 Typ-Inferenz von Typargumenten 543
20.6.5 Syntaktische Mehrdeutigkeiten 545
20.6.6 Verwenden einer generischen Methode durch
einen Delegate 547
20.6.7 Keine generischen Eigenschaften, Ereignisse,
Indexer und Operatoren 547
20.7 Einschränkungen (Constraints) 548
20.7.1 Erfüllen der Einschränkungen 553
20.7.2 Membersuche in Typparametern 555
20.7.3 Typparameter und Boxing 556
20.7.4 Konvertierungen im Zusammenhang mit Typparametern 557
20.8 Ausdrücke und Anweisungen 559
20.8.1 Ausdrücke für die Objekterstellung 559
20.8.2 Der typeof-Operator 560
20.8.3 Gleichheitsoperatoren 562
20.8.4 Der is-Operator 562
20.8.5 Der as-Operator 563
20.8.6 Ausnahmeanweisungen 563
20.8.7 Die lock-Anweisung 563
20.8.8 Die using-Anweisung 563
20.8.9 Die foreach-Anweisung 564
20.9 Überarbeitete Regeln für die Membersuche 564
20.9.1 Namespace- und Typnamen 564
20.9.2 Membersuche 567
20.9.3 Anwendbares Funktionsmember 569
20.9.4 Besseres Funktionsmember 570
20.9.5 Einfache Bezeichner 571
20.9.6 Memberzugriff 573
20.9.7 Methodenaufrufe 575
20.10 Änderungen in der Grammatik für die Rechtsverschiebung 577
21 Anonyme Methoden 579
21.1 Ausdrücke mit anonymen Methoden 579
21.2 Signaturen anonymer Methoden 580
21.3 Konvertierung anonymer Methoden 580
21.4 Blöcke anonymer Methoden 582
21.5 Äußere Variablen 583
21.5.1 »Einfangen« (Capturing) äußerer Variablen 58321.5.2 Instanziierung lokaler Variablen 584
21.6 Auswertung anonymer Methoden 587
21.7 Die Gleichheit von Delegate-Instanzen 588
21.8 Eindeutige Zuweisung 588
21.9 Konvertierung von Methodengruppen 589
21.10 Ausdrücke zur Delegate-Erstellung 591
21.11 Implementierungsbeispiel 591
22 Iteratoren 595
22.1 Iteratorblöcke 595
22.1.1 Enumerator-Interfaces 596
22.1.2 Enumerable-Interfaces 596
22.1.3 Der Yield-Typ 596
22.1.4 this-Zugriff 596
22.2 Enumerator-Objekte 597
22.2.1 Die Methode MoveNext 597
22.2.2 Die Eigenschaft Current 599
22.2.3 Die Methode Dispose 599
22.3 Enumerable-Objekte 600
22.3.1 Die Methode GetEnumerator 601
22.4 Die yield-Anweisung 601
22.4.1 Eindeutige Zuweisung 603
22.5 Implementierungsbeispiel 603
23 Partielle Typen 611
23.1 Partielle Deklarationen 611
23.1.1 Attribute 612
23.1.2 Modifizierer 612
23.1.3 Typparameter und Einschränkungen 613
23.1.4 Die Basisklasse 614
23.1.5 Basis-Interfaces 614
23.1.6 Member 614
23.2 Namensbindung 615
24 Nullable Types 617
24.1 Nullable Types 617
24.1.1 Member 618
24.1.2 Standardwert 618
24.1.3 Die Wertetypeinschränkung 618
24.2 Konvertierungen 619
24.2.1 Konvertierung des null-Literals 619
24.2.2 Konvertierungen von Nullable Types 619
24.2.3 Boxing und Unboxing 620
24.2.4 Erlaubte benutzerdefinierte Konvertierungen 621 24.2.5 Auswertung benutzerdefinierter Konvertierungen 622
24.2.6 Erweiterte Konvertierungen 622
24.2.7 Benutzerdefinierte implizite Konvertierungen 623 24.2.8 Benutzerdefinierte explizite Konvertierungen 624
24.3 Ausdrücke 626
24.3.1 Erweiterte Operatoren 626
24.3.2 Erlaubte benutzerdefinierte Operatoren 627
24.3.3 Auflösung der Operatorüberladung 628
24.3.4 Gleichheitsoperatoren und null 628
24.3.5 Der is-Operator 628
24.3.6 Der as-Operator 629
24.3.7 Zusammengesetzte Operatoren 630
24.3.8 Der Typ bool? 630
24.3.9 Der Koaleszenzoperator (??) 630
25 Weitere Features 633
25.1 Sichtbarkeit von Eigenschaftsaccessoren 633
25.1.1 Deklaration von Eigenschaftsaccessoren 63325.1.2 Verwenden von Eigenschaftsaccessoren 634
25.1.3 Überschreiben und Interface-Implementierung 636
25.2 Statische Klassen 636
25.2.1 Deklaration statischer Klassen 637
25.2.2 Verweise auf Typen statischer Klassen 638
25.3 Qualifizierer für Namespace-Aliase 638
25.3.1 Qualifizierte Alias-Member 641
25.3.2 Eindeutigkeit von Aliasen 642
25.4 Extern-Aliase 643
25.4.1 Alias-extern-Direktiven 646
25.5 Pragma-Direktiven 647
25.5.1 Pragma Warning 648
25.6 Standardwertausdruck 649
25.7 Conditional-Attributklassen 649
25.8 Puffer fester Größe 650
25.8.1 Deklaration von Puffern fester Größe 650
25.8.2 Puffer fester Größe in Ausdrücken 652
25.8.3 Die fixed-Anweisung 653
25.8.4 Überprüfung der eindeutigen Zuweisung 654
Teil III Anhänge 655
A Dokumentationskommentare 657
A.1 Einführung 658
A.2 Empfohlene Tags 659
A.2.1 <c> 660
A.2.2 <code> 661
A.2.3 <example> 661
A.2.4 <exception> 661
A.2.5 <include> 662
A.2.6 <list> 663
A.2.7 <para> 664
A.2.8 <param> 665
A.2.9 <paramref> 665
A.2.10 <permission> 665
A.2.11 <remarks> 666
A.2.12 <returns> 666
A.2.13 <see> 667
A.2.14 <seealso> 667
A.2.15 <summary> 668
A.2.16 <value> 668
A.2.17 <typeparam> 669
A.2.18 <typeparamref> 669
A.3 Verarbeiten der Dokumentationsdatei 669
A.3.1 Format der ID-Strings 670
A.3.2 Beispiele für ID-Strings 671
A.4 Ein Beispiel 675
A.4.1 Der C#-Quellcode 675
A.4.2 Die XML-Ausgabe 678
B Grammatik 681
B.1 Lexikalische Grammatik 681
B.1.1 Zeilenendezeichen 682
B.1.2 Kommentare 682
B.1.3 Leerraum 683
B.1.4 Textelemente 683
B.1.5 Escape-Sequenzen 683
B.1.6 Bezeichner 683
B.1.7 Schlüsselwörter 685
B.1.8 Literale 685
B.1.9 Operatoren und Trennzeichen 688
B.1.10 Präprozessor-Direktiven 688
B.2 Syntaktische Grammatik 692
B.2.1 Grundbegriffe 692
B.2.2 Typen 692
B.2.3 Variablen 694
B.2.4 Ausdrücke 694
B.2.5 Anweisungen 700
B.2.6 Namespaces 704
B.2.7 Klassen 706
B.2.8 Strukturen 714
B.2.9 Arrays 716
B.2.10 Interfaces 716
B.2.11 Aufzählungen 718
B.2.12 Delegates 718
B.2.13 Attribute 719