You are previewing More Effective C#: 50 Specific Ways to Improve Your C#.
O'Reilly logo
More Effective C#: 50 Specific Ways to Improve Your C#

Book Description

“Shining a bright light into many of the dark corners of C# 3.0, this book not only covers the ‘how,’ but also the ‘why,’ arming the reader with many field-tested methods for wringing the most from the new language features, such as LINQ, generics, and multithreading. If you are serious about developing with the C# language, you need this book.”

–Bill Craun, Principal Consultant, Ambassador Solutions, Inc.

More Effective C# is an opportunity to work beside Bill Wagner. Bill leverages his knowledge of C# and distills his expertise down to some very real advice about programming and designing applications that every serious Visual C# user should know. More Effective C# is one of those rare books that doesn’t just regurgitate syntax, but teaches you how to use the C# language.”

–Peter Ritchie, Microsoft MVP: Visual C#

More Effective C# is a great follow-up to Bill Wagner’s previous book. The extensive

C# 3.0 and LINQ coverage is extremely timely!”

–Tomas Restrepo, Microsoft MVP: Visual C++, .NET, and Biztalk Server

“As one of the current designers of C#, it is rare that I learn something new about the language by reading a book. More Effective C# is a notable exception. Gently blending concrete code and deep insights, Bill Wagner frequently makes me look at C# in a fresh light–one that really makes it shine. More Effective C# is at the surface a collection of very useful guidelines. Look again. As you read through it, you’ll find that you acquire more than just the individual pieces of advice; gradually you’ll pick up on an approach to programming in C# that is thoughtful, beautiful, and deeply pleasant. While you can make your way willy-nilly through the individual guidelines, I do recommend reading the whole book–or at least not skipping over the chapter introductions before you dive into specific nuggets of advice. There’s perspective and insight to be found there that in itself can be an important guide and inspiration for your future adventures in C#.”

–Mads Torgersen, Program Manager, Visual C#, Microsoft

“Bill Wagner has written an excellent book outlining the best practices for developers who work with the C# language. By authoring More Effective C#, he has again established himself as one of the most important voices in the C# community. Many of us already know how to use C#. What we need is advice on how to hone our skills so that we can become wiser programmers. There is no more sophisticated source of information on how to become a first-class C# developer than Bill Wagner’s book. Bill is intelligent, thoughtful, experienced, and skillful. By applying the lessons from this book to your own code, you will find many ways to polish and improve the work that you produce.”

–Charlie Calvert, Community Program Manager, Visual C#, Microsoft

In More Effective C#, Microsoft C# MVP and Regional Director Bill Wagner introduces fifty brand-new ways to write more efficient and more robust software. This all-new book follows the same format as Wagner’s best-selling Effective C# (Addison-Wesley, 2005), providing clear, practical explanations, expert tips, and plenty of realistic code examples.

Wagner shows how to make the most of powerful innovations built into Microsoft’s new C# 3.0 and .NET Framework 3.5, as well as advanced C# language capabilities not covered in his previous book. Drawing on his unsurpassed C# experience, the author reveals new best practices for working with LINQ, generics, metaprogramming, and many other features. He also uncovers practices that compromise performance or reliability and shows exactly how to avoid them.

More Effective C# shows how to

  • Use generics to express your design intent more effectively

  • Master advanced generics techniques, such as constraints, method constraints, and generic specialization

  • Use the multithreaded techniques you’ll need to work with the .NET framework every day

  • Express modern design idioms using the rich palette of C# language features

  • Successfully mix object oriented and functional programming constructs

  • Create composable interfaces and avoid confusion in public interfaces

  • Use extension methods to separate contracts from implementation

  • Program successfully with C# closures and anonymous types

  • Write more effective LINQ queries

  • Make the most of LINQ Lazy Evaluation Queries and Lambda Expressions

  • Distinguish and convert between delegates and expression trees

  • Efficiently utilize nullable types and partial classes

  • Use implicit properties for mutable, nonserializable data

  • You’re already a successful C# programmer–this book can help you become an outstanding one.

    Table of Contents

    1. Copyright
      1. Dedication
    2. Praise for More Effective C#
    3. Effective Software Development Series
      1. Titles in the Series
    4. Introduction
      1. Who Should Read This Book?
      2. About the Content
      3. Regarding the Sample Code
      4. Making Suggestions and Providing Feedback
      5. Acknowledgments
    5. 1. Working with Generics
      1. 1. Use Generic Replacements of 1.x Framework API Classes
      2. 2. Define Constraints That Are Minimal and Sufficient
      3. 3. Specialize Generic Algorithms Using Runtime Type Checking
      4. 4. Use Generics to Force Compile-Time Type Inference
      5. 5. Ensure That Your Generic Classes Support Disposable Type Parameters
      6. 6. Use Delegates to Define Method Constraints on Type Parameters
      7. 7. Do Not Create Generic Specialization on Base Classes or Interfaces
      8. 8. Prefer Generic Methods Unless Type Parameters Are Instance Fields
      9. 9. Prefer Generic Tuples to Output and Ref Parameters
      10. 10. Implement Classic Interfaces in Addition to Generic Interfaces
    6. 2. Multithreading in C#
      1. 11. Use the Thread Pool Instead of Creating Threads
      2. 12. Use BackgroundWorker for Cross-Thread Communication
      3. 13. Use lock() as Your First Choice for Synchronization
      4. 14. Use the Smallest Possible Scope for Lock Handles
      5. 15. Avoid Calling Unknown Code in Locked Sections
      6. 16. Understand Cross-Thread Calls in Windows Forms and WPF
    7. 3. C# Design Practices
      1. 17. Create Composable APIs for Sequences
      2. 18. Decouple Iterations from Actions, Predicates, and Functions
      3. 19. Generate Sequence Items as Requested
      4. 20. Loosen Coupling by Using Function Parameters
      5. 21. Create Method Groups That Are Clear, Minimal, and Complete
      6. 22. Prefer Defining Methods to Overloading Operators
      7. 23. Understand How Events Increase Runtime Coupling Among Objects
      8. 24. Declare Only Nonvirtual Events
      9. 25. Use Exceptions to Report Method Contract Failures
      10. 26. Ensure That Properties Behave Like Data
      11. 27. Distinguish Between Inheritance and Composition
    8. 4. C# 3.0 Language Enhancements
      1. 28. Augment Minimal Interface Contracts with Extension Methods
      2. 29. Enhance Constructed Types with Extension Methods
      3. 30. Prefer Implicitly Typed Local Variables
      4. 31. Limit Type Scope by Using Anonymous Types
      5. 32. Create Composable APIs for External Components
      6. 33. Avoid Modifying Bound Variables
      7. 34. Define Local Functions on Anonymous Types
      8. 35. Never Overload Extension Methods
    9. 5. Working with LINQ
      1. 36. Understand How Query Expressions Map to Method Calls
      2. 37. Prefer Lazy Evaluation Queries
      3. 38. Prefer Lambda Expressions to Methods
      4. 39. Avoid Throwing Exceptions in Functions and Actions
      5. 40. Distinguish Early from Deferred Execution
      6. 41. Avoid Capturing Expensive Resources
      7. 42. Distinguish Between IEnumerable and IQueryable Data Sources
      8. 43. Use Single() and First() to Enforce Semantic Expectations on Queries
      9. 44. Prefer Storing Expression<> to Func<>
    10. 6. Miscellaneous
      1. 45. Minimize the Visibility of Nullable Values
      2. 46. Give Partial Classes Partial Methods for Constructors, Mutators, and Event Handlers
      3. 47. Limit Array Parameters to Params Arrays
      4. 48. Avoid Calling Virtual Functions in Constructors
      5. 49. Consider Weak References for Large Objects
      6. 50. Prefer Implicit Properties for Mutable, Nonserializable Data