contents
foreword xvii
preface xix
acknowledgments xxi
about this book xxiii
about the cover illustration xxviii
comments from the tech review xxix
Part 1 Preparing for the journey
- 1 The changing face of C# development
- 1.1 Evolution in action: examples of code change
- 1.2 A brief history of C# (and related technologies)
- 1.3 The .NET platform
- 1.4 Fully functional code in snippet form
- 1.5 Summary
- 2 Core foundations: building on C# 1
- 2.1 Delegates
- 2.2 Type system characteristics
- 2.3 Value types and reference types
- 2.4 C# 2 and 3: new features on a solid base
- 2.5 Summary
Part 2 C# 2: solving the issues of C# 1
- 3 Parameterized typing with generics
- 3.1 Why generics are necessary
- 3.2 Simple generics for everyday use
- 3.3 Beyond the basics
- 3.4 Advanced generics
- 3.5 Generic collection classes in .NET 2.0
- 3.6 Limitations of generics in C# and other languages
- 3.7 Summary
- 4 Saying nothing with nullable types
- 4.1 What do you do when you just don’t have a value?
- 4.2 System.Nullable and System.Nullable
- 4.3 C# 2’s syntactic sugar for nullable types
- 4.4 Novel uses of nullable types
- 5 Fast-tracked delegates
- 5.1 Saying goodbye to awkward delegate syntax
- 5.2 Method group conversions
- 5.3 Covariance and contravariance
- 5/4 Inline delegate actions with anonymous methods
- 5.5 Capturing variables in anonymous methods
- 5.6 Summary
- 6 Implementing iterators the easy way
- 6.1 C# 1: the pain of handwritten iterators
- 6.2 C# 2: simple iterators with yield statements
- 6.3 Real-life example: iterating over ranges
- 6.4 Pseudo-synchronous code with the Concurrency and Coordination Runtime
- 6.5 Summary
- 7 Concluding C# 2: the final features
- 7.1 Partial types
- 7.2 Static classes
- 7.3 Separate getter/setter property access
- 7.4 Namespace aliases
- 7.5 Pragma directives
- 7.6 Fixed-size buffers in unsafe code
- 7.7 Exposing internal members to selected assemblies
- 7.8 Summary
Part 3 C# 3—revolutionizing how we code
- 8 Cutting fluff with a smart compiler
- 8.1 Automatically implemented properties
- 8.2 Implicit typing of local variables
- 8.3 Simplified initialization
- 8.4 Implicitly typed arrays
- 8.5 Anonymous types
- 8.6 Summary
- 9 Lambda expressions and expression trees
- 9/1 Lambda expressions as delegates
- 9.2 Simple examples using List and events
- 9.3 Expression trees
- 9.4 Changes to type inference and overload resolution
- 9.5 Summary
- 10 Extension methods
- 10.1 Life before extension methods
- 10.2 Extension method syntax
- 10.3 Extension methods in .NET 3.5
- 10.4 Usage ideas and guidelines
- 10.5 Summary
- 11 Query expressions and LINQ to Objects
- 11.1 Introducing LINQ
- 11/2 Simple beginnings: selecting elements
- 11.3 Filtering and ordering a sequence
- 11.4 Let clauses and transparent identifiers
- 11.5 Joins
- 11.6 Groupings and continuations
- 11.7 Summary
- 12 LINQ beyond collections
- 12.1 LINQ to SQL
- 12.2 Translations using IQueryable and IQueryProvider
- 12.3 LINQ to DataSet
- 12.4 LINQ to XML
- 12.5 LINQ beyond .NET 3.5
- 12.6 Summary
- 13 Elegant code in the new era
- 13.1 The changing nature of language preferences
- 13.2 Delegation as the new inheritance
- 13.3 Readability of results over implementation
- 13.4 Life in a parallel universe
- 13.5 Farewell
 
appendix: LINQ standard query operators
index