|I was at B&N recently (I wore a mask) and I was looking at the O'Reilly book, C# 8.0 In A Nutshell[^] Flipped it over and noticed it lists at $79.95. Wow!!!
Not sure how B&N stays in business and why they don't simply match the Amazon price ($50.99) (at least).
Anyways, APress books has an electronic bookshelf which is on sale Apress[^] and you get all of their content via downloadable books for 1 year for $79 (normally $99)*.
I hemmed and hawed about it but finally pulled the trigger and I've been reading, Pro ASP.NET Core 3 (Develop Cloud-Ready Web Applications Using MVC 3, Blazor, and Razor Pages)[^].
The author, Adam Freeman, is fantastic. This is one of those rare tech books quite like The Petzold Programming Windows 3.1.
Quote from the book:
Putting Patterns in Their Place
Design patterns provoke strong reactions, as the emails I receive from readers will testify. A substantial proportion of the messages I receive are complaints that I have not applied a pattern correctly.
Patterns are just other people’s solutions to the problems they encountered in other projects. If you find yourself facing the same problem, understanding how it has been
solved before can be helpful. But that doesn’t mean you have to follow the pattern exactly, or at all, as long as you understand the consequences. If a pattern is intended to make projects manageable, for example, and you choose to deviate from that pattern, then you must accept that your project may be more difficult to manage. But a pattern followed slavishly can be worse than no pattern at all, and no pattern is suited to every project.
My advice is to use patterns freely, adapt them as necessary, and ignore zealots who confuse patterns with commandments.
Also, his Chapter 5 : Essential C# Features is a great read that clears up many of the confusing items like
** Managing null values - Use the null conditional and null coalescing operators
** Extending the functionality of a class without modifying it --> Define an extension method
** Expressing functions and methods concisely / Use lambda expressions
** Modifying an interface without requiring changes in its implementation classes --> Define a default implementation
** Performing work asynchronously --> Use tasks or the async/await keywords
** Producing a sequence of values over time --> Use an asynchronous enumerable
*I'm not affiliated with APress or get anything from this. I just read a lot and books are way too expensive.