C# Record: kiedy użyć record zamiast class?
W C# bardzo często tworzymy klasy, które nie zawierają rozbudowanej logiki. Ich głównym zadaniem jest przechowywanie danych: numeru konta, identyfikatora użytkownika, danych adresowych albo odpowiedzi z API.
W takich sytuacjach warto znać typ record. Rekord pozwala zapisać prosty model danych krócej, czytelniej i często bezpieczniej niż klasyczną klasę. Oficjalna dokumentacja Microsoft opisuje rekordy jako dobry wybór dla typów, których podstawowym celem jest przechowywanie danych, a nie definiowanie złożonych zachowań obiektu.
W tym artykule pokażę prosty przykład: jak zwykłą klasę Account zamienić na record.
Czym jest record w C#?
Record to typ w C#, który służy przede wszystkim do reprezentowania danych. Może wyglądać podobnie do klasy, ale daje dodatkowe możliwości przydatne w modelach danych.
Najprościej mówiąc:
class dobrze sprawdza się, gdy obiekt ma zachowanie i zmienny stan. Record dobrze sprawdza się, gdy obiekt głównie przechowuje dane.
Od strony składni record może być zapisany bardzo krótko. Najprostsza forma rekordu może używać parametrów pozycyjnych, które jednocześnie definiują konstruktor i właściwości.
public record Account(string AccountNumber);
Przykład zwykłej klasy w C#
Załóżmy, że mamy prostą klasę Account.
public class Account
{
private string accountNumber;
public string AccountNumber
{
get { return accountNumber; }
set { accountNumber = value; }
}
}
Ten kod jest poprawny. Nie ma w nim nic złego. Mamy tutaj prywatne pole oraz publiczną właściwość. Problem polega na tym, że ta klasa nie robi nic poza przechowywaniem danych. Nie ma metod, dodatkowej logiki ani złożonego zachowania. To dobry kandydat do zamiany na record.
Zamiana class na record

Pierwszy krok może być bardzo prosty. Możemy zamienić słowo kluczowe class na record.
public record Account
{
private string accountNumber;
public string AccountNumber
{
get { return accountNumber; }
set { accountNumber = value; }
}
}
Kod nadal się kompiluje. Nadal mamy typ Account, pole i właściwość. Na tym etapie składnia wygląda podobnie do klasy. Różnica polega na tym, że record daje nam dodatkowe mechanizmy związane z pracą na danych.
Rekord pozycyjny w C#

Tę samą ideę możemy zapisać znacznie krócej:
public record Account(string AccountNumber);
To jest tak zwany rekord pozycyjny. W nawiasie po nazwie rekordu podajemy dane, które rekord ma przechowywać. W tym przypadku jest to tylko jedna wartość: AccountNumber.
Dla rekordu pozycyjnego kompilator C# tworzy automatycznie między innymi publiczną właściwość oraz konstruktor z parametrami zgodnymi z deklaracją rekordu. Zamiast pisać kilka linijek kodu z polem, getterem i setterem, możemy użyć jednej linijki.
Jak utworzyć obiekt rekordu?
Obiekt rekordu tworzymy podobnie jak obiekt klasy.
Account account = new Account("234456");
Z zewnątrz wygląda to znajomo. Mamy typ Account, słowo kluczowe new i przekazujemy numer konta do konstruktora. Możemy potem odczytać wartość:
Console.WriteLine(account.AccountNumber);
Wynik:
234456
Dlaczego wartości w rekordzie nie można łatwo zmienić?

Jeżeli użyjemy rekordu pozycyjnego, właściwość AccountNumber w przypadku record class jest domyślnie właściwością typu init-only. Oznacza to, że można ją ustawić podczas tworzenia obiektu, ale nie można jej później zwyczajnie nadpisać.
account.AccountNumber = "879879";
Taki kod spowoduje błąd kompilacji. To zachowanie pomaga chronić dane przed przypadkową zmianą.
Co oznacza niezmienność danych?
Niezmienność oznacza, że po utworzeniu obiektu jego dane nie powinny być zmieniane w przypadkowy sposób. To przydatne między innymi wtedy, gdy:
- dane powinny reprezentować konkretny stan z danego momentu,
- chcemy ograniczyć przypadkowe modyfikacje,
- przekazujemy obiekt między różnymi częściami aplikacji,
- tworzymy modele DTO,
- pracujemy z odpowiedziami z API,
- zależy nam na bardziej przewidywalnym kodzie.
Kiedy warto użyć record?
Użyj record, gdy tworzysz typ, który głównie przechowuje dane. Przykłady:
public record UserDto(string FirstName, string LastName);
public record ProductResponse(string Name, decimal Price);
public record Address(string Street, string City, string PostalCode);
public record Account(string AccountNumber);
To są typy, których główną rolą jest opis danych. Nie muszą mieć wielu metod ani rozbudowanej logiki.
class vs record w C# – proste porównanie

| Cecha | class | record |
| Główne zastosowanie | Obiekty z zachowaniem i stanem | Modele danych |
| Składnia | Często dłuższa | Może być bardzo krótka |
| Dobry wybór dla logiki biznesowej | Tak | Czasem, ale nie zawsze |
| Dobry wybór dla prostych danych | Możliwy | Bardzo dobry |
| Rekord pozycyjny | Nie dotyczy | Tak |
| Domyślna niezmienność właściwości pozycyjnych | Nie | Tak, dla record class |
Kiedy lepiej zostać przy class?
Nie każdą klasę trzeba zamieniać na rekord. Zostań przy class, gdy typ:
- ma dużo metod,
- zmienia swój stan,
- reprezentuje złożony obiekt domenowy,
- ma zachowanie ważniejsze niż same dane,
- zarządza procesem lub operacją.
Przykład:
public class BankAccount
{
public decimal Balance { get; private set; }
public void Deposit(decimal amount)
{
Balance += amount;
}
public void Withdraw(decimal amount)
{
Balance -= amount;
}
}
Tutaj BankAccount nie jest tylko pojemnikiem na dane. Ma zachowanie: wpłatę i wypłatę środków. W takim przypadku zwykła klasa może być bardziej naturalnym wyborem.
Pełny przykład: od klasy do rekordu
Na początku mieliśmy taki kod:
public class Account
{
private string accountNumber;
public string AccountNumber
{
get { return accountNumber; }
set { accountNumber = value; }
}
}
Możemy go zastąpić takim rekordem:
public record Account(string AccountNumber);
Następnie tworzymy obiekt i odczytujemy numer konta:
Account account = new Account("234456");
Console.WriteLine(account.AccountNumber);
Krótko, czytelnie i bez zbędnego kodu.
Najczęstsze pytania o record w C#
Czy record to to samo co class?
Nie. record może być typem referencyjnym podobnie jak klasa, ale ma inne domyślne zachowania związane z reprezentowaniem danych. Sam zapis record jest skrótem dla record class, czyli typu referencyjnego.
Czy record zawsze jest niemutowalny?
Nie zawsze. W przypadku record class właściwości tworzone przez składnię pozycyjną są domyślnie init-only. Jednak w rekordzie nadal można zdefiniować własne właściwości z set, jeśli tego potrzebujesz.
Czy record nadaje się do DTO?
Tak, rekordy często dobrze pasują do DTO i prostych modeli danych, ponieważ pozwalają zwięźle opisać strukturę danych.
Czy każdą klasę z właściwościami warto zamienić na record?
Nie. Jeśli typ ma logikę, zmienny stan i ważne zachowania, class może być lepszym wyborem.
Podsumowanie
Record w C# to wygodny sposób tworzenia typów, które głównie przechowują dane.
Zamiast pisać dłuższą klasę, możesz użyć krótkiego rekordu:
public record Account(string AccountNumber);
To sprawia, że kod jest krótszy, bardziej czytelny i mniej podatny na przypadkowe zmiany danych.
Najprostsza zasada jest taka:
jeśli typ ma przede wszystkim przechowywać dane, rozważ record.
Jeśli typ ma zachowanie i zmienny stan, zwykle lepsza będzie class.
Zobacz także — powiązane artykuły
👉 MCP w .NET (C#) – jak zbudować serwer AI krok po kroku
👉 Tworzenie klas i obiektów w C# — kompletny przewodnik
👉 Pattern Matching w C# – switch expressions i type patterns
👉 👉 👉 C# Records i wyrażenie with – niemutowalny kod bez boilerplate’u
📣 Call To Action
Jeśli ten materiał był pomocny:
👉 Zostaw komentarz – jak używasz record u siebie?
👉 subskrybuj nasz kanał na YT!
👉 udostępnij artykuł komuś, kto zaczyna z programowaniem
Dołącz do “Od Zera do .NET Developera”
Zacznij swoją przygodę z programowaniem w oparciu o sprawdzone praktyki rynkowe. Wybierz kompletną ścieżkę rozwoju i zbuduj solidne fundamenty.
Dołącz do ścieżki teraz →
