C# record - Co to jest i jak wykorzystać record w C#? Przykłady i wskazówki
Język C# rozwija się z wersji na wersję, wprowadzając nowe mechanizmy, które umożliwiają programistom pisanie czystszego i bardziej zrozumiałego kodu. Jednym z takich nowoczesnych rozwiązań, które zyskały popularność w C# 9.0, jest typ danych o nazwie record. Wiele osób zastanawia się, czym dokładnie są te rekordy, jak się je stosuje i dlaczego warto z nich korzystać. W tym artykule przyjrzymy się bliżej typowi record w C#, jego cechom i praktycznemu zastosowaniu.
Co to jest typ record w C#?
Typ record w C# to nowość, która została wprowadzona w wersji C# 9.0. Jest to specjalny typ danych, który ma na celu ułatwienie pracy z obiektami, które są niemutowalne (immutable) i przechowują tylko dane. W tradycyjnych klasach obiektowych w C# często tworzyliśmy klasy do przechowywania danych, jednak musieliśmy sami implementować metody do porównywania obiektów, kopiowania ich i weryfikowania równości. Z pomocą przychodzi właśnie record, który robi to za nas w sposób automatyczny!
Rekordy są szczególnie przydatne, gdy chodzi o modele danych, które powinny być niezmienne po utworzeniu. W C# rekordy nie wymagają pisania dodatkowego kodu, aby zapewnić funkcjonalności takie jak porównywanie obiektów, generowanie hash code, czy implementowanie metody ToString(). C# record to oszczędność czasu, miejsca w kodzie oraz większa czytelność!
Jak zadeklarować rekord w C#?
Rekordy w C# tworzymy za pomocą słowa kluczowego record, które pozwala na zdefiniowanie nowego typu. W przeciwieństwie do tradycyjnych klas, które muszą mieć jawnie zdefiniowany konstruktor, rekordy automatycznie generują konstruktor na podstawie właściwości. Oto przykład deklaracji prostego rekordu:
public record Osoba(string Imie, string Nazwisko, int Wiek);
W tym przypadku zdefiniowaliśmy rekord Osoba, który przechowuje trzy właściwości: Imie, Nazwisko i Wiek. Co ważne, dzięki konstrukcji z record w C#, nie musimy ręcznie definiować konstruktora ani innych metod, ponieważ wszystko jest generowane automatycznie.
Tworzenie instancji rekordu
Tworzenie instancji rekordu jest bardzo podobne do tworzenia instancji klasy. Możemy przypisać wartości do właściwości w trakcie tworzenia obiektu:
var osoba1 = new Osoba("Jan", "Kowalski", 30);
W tym przypadku stworzyliśmy obiekt osoba1 typu Osoba, który ma przypisane wartości: "Jan" dla imienia, "Kowalski" dla nazwiska i 30 dla wieku.
Rekordy są niemutowalne
Jedną z najważniejszych cech rekordów w C# jest to, że są one niemutowalne. Oznacza to, że po utworzeniu instancji rekordu nie możemy zmienić jego właściwości. Jest to bardzo istotne, ponieważ zapewnia, że obiekt pozostaje w niezmiennym stanie przez cały czas jego istnienia. Dzięki temu możemy być pewni, że dane zawarte w rekordzie nie ulegną przypadkowej modyfikacji, co poprawia bezpieczeństwo aplikacji.
Porównywanie rekordów w C#
W tradycyjnych klasach porównanie obiektów odbywa się na podstawie referencji, czyli sprawdzane jest, czy dwie zmienne wskazują na ten sam obiekt w pamięci. W rekordach natomiast porównanie obiektów odbywa się na podstawie wartości. Oznacza to, że dwa rekordy z identycznymi wartościami będą uznawane za równe, nawet jeśli będą to różne instancje obiektów w pamięci. Zobaczmy to w praktyce:
var osoba2 = new Osoba("Jan", "Kowalski", 30);
var osoba3 = new Osoba("Jan", "Kowalski", 30);
Console.WriteLine(osoba2 == osoba3); // True
W powyższym przykładzie porównujemy dwa rekordy o identycznych wartościach. Mimo że są to różne obiekty w pamięci, wynik porównania to true, ponieważ rekordy są porównywane na podstawie wartości, a nie referencji.
Rekordy a mutowalność
Choć rekordy są z definicji niemutowalne, możemy stworzyć rekordy, które będą zawierały właściwości zmienne. Możemy to osiągnąć, dodając słowo kluczowe init zamiast set przy właściwościach. Dzięki temu właściwości mogą być ustawiane tylko podczas inicjalizacji obiektu, ale po jego utworzeniu stan tych właściwości już się nie zmieni:
public record Produkt(string Nazwa, decimal Cena)
{
public string Kategoria { get; init; }
}
var produkt = new Produkt("Laptop", 2500.50m) { Kategoria = "Elektronika" };
W tym przypadku właściwość Kategoria może być ustawiona tylko podczas tworzenia obiektu, a nie po jego utworzeniu. Jest to przykład połączenia niemutowalności z możliwością przypisania wartości do właściwości w trakcie inicjalizacji.
Rekordy i inne metody
Rekordy w C# generują kilka pomocniczych metod, które są przydatne w codziennej pracy. Są to m.in.:
- ToString() – Zwraca reprezentację tekstową obiektu, która domyślnie zawiera nazwy właściwości oraz ich wartości.
- Deconstruct() – Pozwala na rozbicie obiektu na poszczególne wartości, co jest bardzo wygodne w przypadku pracy z tuplami.
- With() – Umożliwia utworzenie nowej instancji rekordu, zmieniając tylko określoną właściwość, pozostawiając resztę bez zmian.
Przykład z wykorzystaniem With() i Deconstruct()
Rekordy w C# pozwalają na zastosowanie wielu praktycznych metod, oto przykład użycia Deconstruct oraz With:
var osoba4 = new Osoba("Anna", "Nowak", 25);
var (imie, nazwisko, wiek) = osoba4; // Deconstruct
var osoba5 = osoba4 with { Wiek = 26 }; // With
W tym przypadku używamy Deconstruct, aby rozbić rekord osoba4 na poszczególne zmienne, a następnie używamy With, aby stworzyć nowy rekord na podstawie istniejącego, zmieniając tylko wiek.
Podsumowanie
Rekordy w C# to świetne narzędzie, które pozwala na tworzenie czystych i czytelnych klas przechowujących dane. Ich główną zaletą jest niemutowalność, co zapewnia bezpieczeństwo i stabilność aplikacji. Dzięki automatycznemu generowaniu metod takich jak Equals(), ToString() czy Deconstruct(), programista może skupić się na logice aplikacji, a nie na tworzeniu boilerplate code. Rekordy to krok ku nowoczesnym praktykom programistycznym, które pomagają utrzymać kod w porządku i zgodny z dobrymi praktykami projektowymi.

Komentarze (0) - Nikt jeszcze nie komentował - bądź pierwszy!