Class vs Record Class vs Record Struct: Value Equality vs Reference Equality
1Concept
Records (`record class` or `record struct`) synthesize value-based equality (`Equals`, `GetHashCode`, `==`), string formatting (`ToString`), and deconstructors automatically at compile-time.
2Architecture Diagram
Class (Reference Equality): [ Class A (ID: 1) ] == [ Class B (ID: 1) ] ──> FALSE (Different heap pointers) Record (Value Equality): [ Record A (ID: 1) ] == [ Record B (ID: 1) ] ──> TRUE (Synthesized field equality)
3Code Example
C# 13 & .NET 9
using System;
public record UserProfile(int Id, string Username, string Tier);
public readonly record struct GeoLocation(double Latitude, double Longitude);
public class RecordComparisonDemo
{
public static void Main()
{
var u1 = new UserProfile(101, "alex_dev", "PRO");
var u2 = new UserProfile(101, "alex_dev", "PRO");
Console.WriteLine($"Record Class Equality: {u1 == u2}"); // True!
Console.WriteLine($"Record ToString: {u1}");
var loc1 = new GeoLocation(37.7749, -122.4194);
var loc2 = new GeoLocation(37.7749, -122.4194);
Console.WriteLine($"Record Struct (Stack Value) Equality: {loc1 == loc2}"); // True!
}
}4Expected Output
Record Class Equality: True
Record ToString: UserProfile { Id = 101, Username = alex_dev, Tier = PRO }
Record Struct (Stack Value) Equality: True5Key Takeaways
- ✓Use `record class` for immutable DTOs, events, and API payloads.
- ✓Use `readonly record struct` for high-throughput zero-heap-allocation mathematical coordinates and keys.
- ✓Standard classes should be used when entity identity (reference equality) is required.