Phase 7 of 30 · Topic 7.1

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: True

5Key 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.