C# is an object-oriented language, which means the unit you work in is the type. A class describes what something is and what it can do, an interface describes only what it can do, and an object is one live instance of a class sitting in memory.

The four ideas underneath all of it are encapsulation (hide the inside), inheritance (build a type from another type), polymorphism (one call, several behaviours) and abstraction (name the idea, not the implementation). Every article on this page is one of those four ideas applied to a real problem.

C# has also grown a lot of type kinds since it started. Alongside class and struct you now have record, record struct, tuple and ValueTuple, and the one you pick changes how your code behaves. There is a section below on it.

This is the biggest topic on the blog, so use the sections. Start at the top if you are learning, or jump to whichever one matches what you are stuck on.

Classes, Objects and Constructors

The starting point: declaring a type and getting an instance of it.

Properties and Fields

How a type exposes its state, and the difference between the two ways of doing it.

Methods, Parameters and Overloading

Everything about calling code: how many arguments, what comes back, and which overload actually runs.

Inheritance, Interfaces and Polymorphism

The part of OOP people argue about. These articles include when not to inherit.

Records, Structs, Tuples and Anonymous Types

Choosing between the type kinds C# now gives you.

Generics, Delegates and Events

Writing a type once and using it with many other types, and letting objects notify each other.

Enums and Constants

Named values, and the difference between a value fixed at compile time and one fixed at construction.

Nulls, Equality and Comparison

Two of the most common sources of a bug that only shows up in production.

Operators, Conversions and Casting

Turning one type into another, safely and unsafely.

More Types and Objects

Everything else about types and objects in C#.

Where to Go Next

Where to go after the language itself:

Most arguments about OOP turn out to be arguments about inheritance. Composition covers more cases than people expect, so try it first and inherit when you genuinely have an is-a relationship.