Hej! Jeśli przez ostatnie parę lat utknąłeś w starszych wersjach .NET lub języka C#, to ten post będzie idealny dla Ciebie! Jeśli jesteś w miarę na bieżąco, może to być dobra okazja, żeby odświeżyć informacje.
Uważam, że zmiany, które zaszły w .NET przez ostatnie lata, to prawdziwe mistrzostwo i coś, czego platforma bardzo potrzebowała. Sam pomysł stworzenia .NET Core to był majstersztyk, a ja cieszę się, że mogłem śledzić postępy od samego początku. Pamiętam, jak wiele się zmieniało i jak dużo trzeba było modyfikować w projektach, żeby zaktualizować je do kolejnych wersji. Nie zniechęcajcie się jednak – takie trudności występowały głównie do czasu wydania pierwszej stabilnej wersji 1.0.
Dzięki temu projektowi platforma nie tylko została odświeżona i „odczepiona” od Windowsa (teraz możemy uruchamiać .NET na Linuxie i macOS), ale także sam język C# zaczął intensywnie ewoluować. Wprowadzono wiele świetnych funkcji, które uprzyjemniają codzienną pracę programistów.
Chciałbym przedstawić Wam najciekawsze (moim zdaniem) nowości, które znacząco ułatwiają mi codzienny development. Zobaczmy, co ciekawego pojawiło się w ostatnich latach!
Out Variables
W C# mieliśmy słówko kluczowe out
, które było przydatne, gdy chcieliśmy zwrócić z metody więcej niż jeden parametr. Wcześniej, jeśli chcieliśmy użyć out
, musieliśmy najpierw zadeklarować zmienną, a następnie przekazać ją do metody ze słówkiem out
. Natomiast po wprowadzonych zmianach możemy teraz zadeklarować zmienną bezpośrednio podczas jej przekazywania do metody!
//stare podejście
int number;
int.TryParse("12", out number);
//nowe podejście
int.TryParse("12", out var number);
Expression-bodied members
Możemy tego używać dla metod, właściwości i konstruktorów, co pozwala na skrócenie zapisu. Jest to szczególnie przydatne w przypadku prostych fragmentów kodu. Używamy symbolu =>
, podobnie jak przy lambdach, dzięki czemu nie musimy umieszczać kodu w klamrach.
// metoda
public int Add(int a, int b) => a + b;
// konstruktor
private Guid _id;
public IdProvider() => _id = Guid.NewGuid();
// readonly property
public int Age => 25;
// property
private string _email;
public string Email
{
get => _email;
set => _email = value;
}
Literal improvements
Otrzymaliśmy kilka usprawnień, z których jedno z najważniejszych to string interpolation. Pozwala ono na dużo łatwiejsze „sklejanie” stringów przy użyciu wielu parametrów. Jest to świetna alternatywa dla string.Format
, która, moim zdaniem, jest znacznie wygodniejsza w użyciu.
Kolejnym usprawnieniem jest możliwość stosowania znaku _
przy zapisie wartości liczbowych. Jest to szczególnie przydatne przy długich liczbach, ponieważ pozwala na ich bardziej czytelne przedstawienie.
// string interpolation
var fullName = $"{name} {surname}";
// digit separator
public int Million = 1_000_000_000;
Generic Atrributes
Czegoś takiego brakowało wielu osobom – sam kilka razy, dawno temu, próbowałem znaleźć sposób, aby kod wyglądał lepiej. W końcu się udało! Teraz można definiować atrybuty z typami generycznymi.
public class GenericAttribute<T> : Attribute
{
public T Value { get; set; }
}
Init keyword
Tak jak przy właściwościach mieliśmy get
i set
, teraz otrzymaliśmy kolejne słowo kluczowe – init
. Dzięki niemu możemy wymusić, aby wartość właściwości była ustawiana wyłącznie podczas inicjalizacji obiektu. Próba zmiany tej wartości na innym etapie skutkuje błędem.
public class Customer
{
public string Name { get; init; }
}
var customer = new Customer
{
Name = "Jakub"
};
customer.Name = "Kuba"; // Error - Init-only property
Podsumowanie
Język C# otrzymał wiele nowych usprawnień na przestrzeni ostatnich lat. Wymieniłem tylko kilka z nich, aby pobudzić Twoją ciekawość. Istnieje jednak wiele innych funkcjonalności, o których trudno byłoby napisać w formie skrótu – każda z nich zasługuje na osobny post, który planuję przygotować w najbliższej przyszłości:
- Rekordy
- Pattern Matching
- Zmiany związane z kolekcjami
Listę wszystkich zmian można znaleźć tutaj. Postaram się również regularnie wracać na blogu do tych najbardziej interesujących.