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
| Modifier | Visibility |
|---|---|
public | Everywhere |
private | Same class only |
protected | Same class + derived classes |
internal | Same assembly |
protected internal | Same assembly OR derived classes |
file | Same 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.