Figures xvii Tables xix Foreword to the Third Edition xxi Foreword to the Second Edition xxiii Foreword to the First Edition xxv Preface xxvii Acknowledgments xxxiii About the Authors xxxv About the Annotators xxxvii Chapter 1: Introduction 1 1.1 Qualities of a Well-Designed Framework 3 Chapter 2: Framework Design Fundamentals 9 2.1 Progressive Frameworks 12 2.2 Fundamental Principles of Framework Design 15 Chapter 3: Naming Guidelines 41 3.1 Capitalization Conventions 42 3.2 General Naming Conventions 52 3.3 Names of Assemblies, DLLs, and Packages 61 3.4 Names of Namespaces 63 3.
5 Names of Classes, Structs, and Interfaces 67 3.6 Names of Type Members 74 3.7 Naming Parameters 79 3.8 Naming Resources 81 Chapter 4: Type Design Guidelines 83 4.1 Types and Namespaces 85 4.2 Choosing Between Class and Struct 89 4.3 Choosing Between Class and Interface 92 4.4 Abstract Class Design 100 4.
5 Static Class Design 102 4.6 Interface Design 104 4.7 Struct Design 106 4.8 Enum Design 111 4.9 Nested Types 124 4.10 Types and Assembly Metadata 127 4.11 Strongly Typed Strings 129 Chapter 5: Member Design 135 5.1 General Member Design Guidelines 135 5.
2 Property Design 158 5.3 Constructor Design 165 5.4 Event Design 175 5.5 Field Design 180 5.6 Extension Methods 184 5.7 Operator Overloads 192 5.8 Parameter Design 202 5.9 Using Tuples in Member Signatures 220 Chapter 6: Designing for Extensibility 227 6.
1 Extensibility Mechanisms 227 6.2 Base Classes 242 6.3 Sealing 244 Chapter 7: Exceptions 249 7.1 Exception Throwing 254 7.2 Choosing the Right Type of Exception to Throw 260 7.3 Using Standard Exception Types 273 7.4 Designing Custom Exceptions 279 7.5 Exceptions and Performance 281 Chapter 8: Usage Guidelines 287 8.
1 Arrays 287 8.2 Attributes 291 8.3 Collections 294 8.4 DateTime and DateTimeOffset 306 8.5 ICloneable 308 8.6 IComparable and IEquatable 309 8.7 IDisposable 311 8.8 Nullable 311 8.
9 Object 312 8.10 Serialization 319 8.11 Uri 321 8.12 System.Xml Usage 323 8.13 Equality Operators 324 Chapter 9: Common Design Patterns 329 9.1 Aggregate Components 329 9.2 The Async Patterns 339 9.
3 Dependency Properties 365 9.4 Dispose Pattern 372 9.5 Factories 394 9.6 LINQ Support 400 9.7 Optional Feature Pattern 408 9.8 Covariance and Contravariance 412 9.9 Template Method 423 9.10 Timeouts 426 9.
11 XAML Readable Types 427 9.12 Operating on Buffers 430 9.13 And in the End. 464 Appendix A: C# Coding Style Conventions 465 A.1 General Style Conventions 466 A.2 Naming Conventions 480 A.3 Comments 482 A.4 File Organization 483 Appendix B: Obsolete Guidance 487 Appendix C: Sample API Specification 523 Appendix D: Breaking Changes 529 D.
1 Modifying Assemblies 530 D.2 Adding Namespaces 531 D.3 Modifying Namespaces 532 D.4 Moving Types 532 D.5 Removing Types 533 D.6 Modifying Types 534 D.7 Adding Members 539 D.8 Moving Members 541 D.
9 Removing Members 542 D.10 Overloading Members 544 D.11 Changing Member Signatures 545 D.12 Changing Behavior 553 D.13 A Final Note 556 Glossary 557 Index 563.