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