Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Checklist for Reference Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Checklist for Value Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
■CHAPTER 14 Extension Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Introduction to Extension Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
How Does the Compiler Find Extension Methods? . . . . . . . . . . . . . . . . 418
Under the Covers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
Code Readability vs. Code Understandability. . . . . . . . . . . . . . . . . . . . . 422
Recommendations for Use. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Consider Extension Methods Over Inheritance . . . . . . . . . . . . . . . . . . . 423
Isolate Extension Methods in Separate Namespace . . . . . . . . . . . . . . . 424
Changing a Type’s Contract Can Break Extension Methods . . . . . . . . . . 425
Transforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
Operation Chaining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
Custom Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Borrowing from Functional Programming . . . . . . . . . . . . . . . . . . . . . . . 432
The Visitor Pattern. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
■CHAPTER 15 Lambda Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
Introduction to Lambda Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
Lambda Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
Lambda Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
Expression Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
Operating on Expressions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Functions As Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Useful Applications of Lambda Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Iterators and Generators Revisited . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Closures (Variable Capture) and Memoization. . . . . . . . . . . . . . . . . . . . 456
Currying. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Anonymous Recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
■CHAPTER 16 LINQ: Language Integrated Query. . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
A Bridge to Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Query Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Extension Methods and Lambda Expressions Revisited . . . . . . . . . . . . 468
Standard Query Operators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
■CONTENTSxiv
8733fmCMP4.qrk 10/16/07 11:04 AM Page xiv