Classes and OOP

C# is object-oriented at its core. Classes are the primary building block.

Basic Class

public class Animal
{
    public string Name { get; }

    public Animal(string name)
    {
        Name = name;
    }

    public virtual void Speak() => Console.WriteLine($"{Name} makes a sound");
}

Inheritance

public class Dog : Animal
{
    public Dog(string name) : base(name) { }

    public override void Speak() => Console.WriteLine($"{Name} barks");
}

var dog = new Dog("Rex");
dog.Speak(); // "Rex barks"

Interfaces

Contracts that classes must implement:

public interface ISerializable
{
    string Serialize();
    static abstract ISerializable Deserialize(string data); // .NET 7+
}

public class User : ISerializable
{
    public string Name { get; init; } = "";
    public string Serialize() => JsonSerializer.Serialize(this);
    public static ISerializable Deserialize(string data) =>
        JsonSerializer.Deserialize<User>(data)!;
}

Access Modifiers

ModifierVisibility
publicEverywhere
privateSame class only
protectedSame class + derived classes
internalSame assembly
protected internalSame assembly OR derived classes
fileSame file only (.NET 7+)

Abstract vs Sealed

// Can't instantiate, must subclass
public abstract class Shape
{
    public abstract double Area();
}

// Can't subclass further
public sealed class Circle : Shape
{
    public double Radius { get; init; }
    public override double Area() => Math.PI * Radius * Radius;
}

Primary Constructors (.NET 8+)

public class UserService(IDatabase db, ILogger logger)
{
    public User? GetUser(string id)
    {
        logger.Log($"Fetching user {id}");
        return db.Find<User>(id);
    }
}

Tip: Primary constructors reduce boilerplate for dependency injection. The parameters are captured as fields automatically.