Prices shown are a USD base. Your local-market price is calculated at checkout in your own currency, plus any local sales tax.
What is inside
20 chapters, in the order the interviews tend to ask them:
Types, values and the type system
Structs, classes, records and object lifetime
Nullability and reference types
Generics, constraints and variance
Delegates, events and lambdas
Iterators and yield return
Exceptions and error handling
Collections and their performance
LINQ and deferred execution
Async, await and the execution model
Concurrency and synchronisation
Memory and the garbage collector
The CLR, the JIT and assembly loading
Projects, the build and packaging
Dependency injection and configuration
ASP.NET Core middleware and the pipeline
Minimal APIs, controllers and endpoints
Entity Framework Core and data access
Logging, performance and diagnostics
Testing: unit and integration
How the answers are built
Each chapter opens with the checklist the question is really testing. A few from this pack:
A value type stores its data inline and copies on assignment, while a reference type stores a handle to a separate heap object and copies only that handle.
A struct is right when the value is small, immutable, short lived and compared by value, because it is stored inline and carries no object header.
Nullable reference types became a per project or per file compiler setting in C# 8, not a runtime feature, and they are switched on with the Nullable project property.
A where constraint narrows what the compiler knows about a type parameter, so an unconstrained parameter effectively carries only the members of object.
A delegate type declares a signature, a delegate instance is an immutable list of targets paired with methods, and the plus operator combines instances into a new one.
A method containing yield return is rewritten into a generated class implementing both IEnumerable<T> and IEnumerator<T>, with a MoveNext that advances one step at a time.
Questions this pack covers
What is the difference between a value type and a reference type?
Why does assigning a struct copy the value?
When should a type be a struct rather than a class?
What does a record give you that a class does not?
What does a nullable reference type annotation actually enforce?
Why is a compiler warning not the same as a null check?
What does a where constraint buy the compiler?
How does the runtime instantiate a generic type or method?
Each one is answered in full in the pack, with the reasoning written out rather than a bullet list.