C# in Depth by Jon Skeet (Third Edition)
At 540 pages, C# In Depth covers the development of the C# programming language in a novel, narrative form. It looks at each version of the language and explains its major features and reception. Readers who have been using C# for a few years will most benefit from the book, in particular those who understand compiler errors, are familiar with some of the different collections implementation the .NET framework provides, and have no troubles with the syntax of the language. In other words, this is not a “this is how you declare a class or method” introduction to C#, and I’d recommend reading a few introductory books and working with the language for a while before starting on this book. If in doubt, head over to the book’s website and read some of the articles to get a feeling of how the book is written.
What’s different about this book from every other programming-language book I’ve read is how it presents the evolution of the language over the past 15 years. Each C# versions had new features and updates to existing features, and Skeets’ explanations of the whats, whys and hows are enlightening. In particular, his coverage of Nullable-value Types, Generics, and LINQ were comprehensive and helpful. Beyond explaining how developers should use these features, he explains how these features are implemented by the language and .NET library framework creators, leading to a fuller understanding of how the different parts work together and what they contribute to the language. The in-depth explanations also serve the function of solidifying the features in the reader’s mind–after reading these sections it’s unlikely that you’ll forget them. You’ll also become clearly aware of the differences between the .NET Framework, IL, the CLR and C# itself, if you were not already.
Beyond the utility of remembering all of these features, the book is also a pleasure to read. Skeets’ attraction to and admiration of the C# language shines throughout the book. Sometimes when explaining particularly difficult or complex topics, he realizes that most people won’t be interested in all of the minutia, so he tells the reader that it’s perfectly acceptable to jump to a later section in the book and to review this section at a later time. In doing so, Skeet tries to keep the larger picture ever present, even though he dives deeply into the details of each component of the larger picture.
That said, there were some sections that felt lacking, when compared to the in-depth coverage on the big topics (LINQ, Generics, Async-Await). Admittedly, C# is a complex language that has taken 15 years to define and refine, so it’s not realistic to expect perfect coverage of every topic and feature. Nevertheless, topics that are covered, but more superficially, feel a out of place. For example, the DLR section was not as comprehensive as the LINQ or Generics sections, perhaps because Skeet is less of an expert on this topic or because he felt that many of his readers would not use this feature as much as the others. Perhaps Skeet would have been more effective and loyal to his task of covering C# in-depth by stating that such features existed and providing links to where to follow up.
Overall, if you’d like to get a deeper understanding of C#, I highly recommend dedicating some time to read this book.