The Decision Tree
My rule of thumb: class for mutable domain objects with identity, record for immutable data transfer objects where equality is by value, struct for small value types that are frequently stack-allocated. record struct exists too for value-type records.