Class, struct eller record — vilken?

Du har nu läst om alla fyra — Klasser, Struct och Records — separat. Den här sidan samlar dem i en beslutstabell.

De fyra alternativen

classstructrecordrecord struct
SemantikReferensVärdeReferensVärde
== jämförIdentitetInnehållInnehållInnehåll
Kan ärvasJaNejJa (från annan record)Nej
Kan vara nullJaNej (utan ?)JaNej (utan ?)
Tänkt att muterasJa, oftaJa, oftaNej — init-onlyNej — init-only
with-stödNejNejJaJa
Typisk storlekValfriLitenValfriLiten

Beslutsvägen

Behöver typen arv, eller representerar den en identitet (ett objekt med beteende som kan ändras över tid)? → class.

public class Konto // Har beteende, muterbart tillstånd, kan ärvas från
{
public decimal Saldo { get; private set; }
public void SättIn(decimal belopp) => Saldo += belopp;
}

Representerar typen ett värde som ska jämföras på innehåll, och helst inte förändras efter skapandet — och behöver den kunna ärvas eller vara null? → record.

public record Transaktion(decimal Belopp, DateTime Tid); // Data, jämförs på innehåll, immutable

Samma som ovan, men typen är liten och du vill undvika onödiga heap-allokeringar? → record struct.

public record struct Punkt(int X, int Y); // Litet värde, värdesemantik, immutable

Ett litet, enkelt värde där mutabilitet är okej och identitet inte spelar roll — men du inte behöver records extra funktioner? → struct.

struct RGB { public byte R, G, B; } // Litet, enkelt, sällan behöver Equals/with

Konkreta exempel ur den här boken

TypVad den varVal
Person (i Records)Data som jämförs på innehåll, ska inte muterasrecord
Point (i Struct)Litet värde, kopieras billigtstruct eller record struct
Konto (i Undantagshantering)Har beteende och muterbart tillstånd (TaUt)class
Kronor (i Egna datatyper)Litet numeriskt värde med aritmetikrecord struct

TL;DR

class är standardvalet för allt med beteende eller identitet. struct/record struct för små värden som kopieras ofta. record/record struct när du vill ha värdelikhet och immutability gratis. Osäker? Börja med class eller record — optimera till struct bara när du faktiskt mätt att kopieringskostnaden spelar roll.