Chapter 1 Working with Generics 1
Item 1:Use Generic Replacements of 1.x Framework API Classes 4
Item 2:Define Constraints That Are Minimal and Sufficient 14
Item 3:Specialize Generic Algorithms Using Runtime Type Checking 19
Item 4:Use Generics to Force Compile-Time Type Inference 26
Item 5:Ensure That Your Generic Classes Support Disposable Type Parameters 32
Item 6:Use Delegates to Define Method Constraints on Type Parameters 36
Item 7:Do Not Create Generic Specialization on Base Classes or Interfaces 42
Item 8:Prefer Generic Methods Unless Type Parameters Are Instance Fields 46
Item 9:Prefer Generic Tuples to Output and Ref Parameters 50
Item 10:Implement Classic Interfaces in Addition to Generic Interfaces 56
Chapter 2 Multithreading in C 63
Item 11:Use the Thread Pool Instead of Creating Threads 67
Item 12:Use BackgroundWorker for Cross-Thread Communication 74
Item 13:Use lock() as Your First Choice for Synchronization 78
Item 14:Use the Smallest Possible Scope for Lock Handles 86
Item 15:Avoid Calling Unknown Code in Locked Sections 90
Item 16:Understand Cross-Thread Calls in Windows Forms and WPF 93
Chapter 3 C# Design Practices 105
Item 17:Create Composable APIs for Sequences 105
Item 18:Decouple Iterations from Actions,Predicates,and Functions 112
Item 19:Generate Sequence Items as Requested 117
Item 20:Loosen Coupling by Using Function Parameters 120
Item 21:Create Method Groups That Are Clear,Minimal,and Complete 127
Item 22:Prefer Defining Methods to Overloading Operators 134
Item 23:Understand How Events Increase Runtime Coupling Among Objects 137
Item 24:Declare Only Nonvirtual Events 139
Item 25:Use Exceptions to Report Method Contract Failures 146
Item 26:Ensure That Properties Behave Like Data 150
Item 27:Distinguish Between Inheritance and Composition 156
Chapter 4 C# 3.0 Language Enhancements 163
Item 28:Augment Minimal Interface Contracts with Extension Methods 163
Item 29:Enhance Constructed Types with Extension Methods 167
Item 30:Prefer Implicitly Typed Local Variables 169
Item 31:Limit Type Scope by Using Anonymous Types 176
Item 32:Create Composable APIs for External Components 180
Item 33:Avoid Modifying Bound Variables 185
Item 34:Define Local Functions on Anonymous Types 191
Item 35:Never Overload Extension Methods 196
Chapter 5 Working with LINQ 201
Item 36:Understand How Query Expressions Map to Method Calls 201
Item 37:Prefer Lazy Evaluation Queries 213
Item 38:Prefer Lambda Expressions to Methods 218
Item 39:Avoid Throwing Exceptions in Functions and Actions 222
Item 40:Distinguish Early from Deferred Execution 225
Item 41:Avoid Capturing Expensive Resources 229
Item 42:Distinguish Between IEnumerable and IQueryable Data Sources 242
Item 43:Use Single() and First() to Enforce Semantic Expectations on Queries 247
Item 44:Prefer Storing Expression<>to Func<> 249
Chapter 6 Miscellaneous 255
Item 45:Minimize the Visibility of Nullable Values 255
Item 46:Give Partial Classes Partial Methods for Constructors,Mutators,and Event Handlers 261
Item 47:Limit Array Parameters to Params Arrays 266
Item 48:Avoid Calling Virtual Functions in Constructors 271
Item 49:Consider Weak References for Large Objects 274
Item 50:Prefer Implicit Properties for Mutable,Nonserializable Data 277
Index 283