Roadmap › C# Language — Basics to Advanced › Module: Types in Depth
Lessons in this course (38)

15. Classes, structs, records and enums

Basic★ Must knowLesson 15 of 38
csharp
public class Customer                       // reference type, identity semantics
{
    public int Id { get; init; }
    public required string Name { get; set; }  // required (C# 11)
}

public struct Money(decimal amount, string currency)   // value type; primary constructor (C# 12)
{
    public decimal Amount { get; } = amount;
    public string Currency { get; } = currency;
}

public record Order(int Id, decimal Total);  // reference type with VALUE equality
public record struct Coord(double Lat, double Lng);

public enum Status { Pending = 1, Shipped = 2, Delivered = 3 }

[Flags] public enum Perm { None = 0, Read = 1, Write = 2, Delete = 4 }
var p = Perm.Read | Perm.Write;
bool canWrite = p.HasFlag(Perm.Write);

var o1 = new Order(1, 100);
var o2 = o1 with { Total = 120 };   // non-destructive copy
Console.WriteLine(o1 == new Order(1, 100)); // True — value equality

Choose: class for entities with identity/behaviour; struct for small immutable values (< ~16 bytes, no inheritance); record for DTOs and immutable data compared by value.