21.05.20203 min

Redakcja Bulldogjob

C# 9.0 w wersji preview już dostępny

Wersja preview C# 9.0 została właśnie wydana. Najnowsza odsłona wydania C# 9.0 daje dostęp do kilku przydatnych nowości składniowych.

C# 9.0 w wersji preview już dostępny

C# 9.0 jest już bliżej i coraz bardziej nabiera kształtu. Użytkownicy mogą się aktualnie cieszyć jego wydaniem preview. Twórcy obiecują, że z każdym nowym wydaniem będą zwiększać czytelność oraz prostotę tego języka. Tak więc, począwszy 1998 roku i pierwszych jego wersji, C# nieustannie się rozwijał, a użytkownicy dostawali od Microsoftu przeróżne nowości.

C# 9.0 nie jest wyjątkiem i również posiada szereg świeżych ficzerów usprawniających działanie tego języka. Sprawdźmy, co developerzy z Microsoftu mają do zaproponowania tym razem. Do dzieła!


Niemutowalne właściwości w obiektach

W C# mamy inicjalizatory obiektów, które bardzo zmniejszyły ilość kodu wymaganego do obsługi właściwości, szczególnie w obiektach typu POCO. Jest to możliwe, dzięki automatycznie implementowanym właściwościom:

public class Cat
{
    public int Age { get; set; }
}

Do tej pory można było w ten sposób tworzyć tylko mutowalne właściwości, ale w C# 9.0 pojawiło się nowe słowo kluczowe, które pozwala na modyfikację wartości tylko w czasie inicjalizacji obiektu. W tym celu dla danej właściwości użyjemy init zamiast set, co pozwoli na modyfikację właściwości tylko w czasie inicjalizacji.

public class Cat
{
    public int Age { get; init; }
}


Rekordy

Idąc za ciosem, w C# zrewidowano pojęcie rekordów, czyli obiektów, które składają się w całości z niemutowalnych właściwości. Rekordy deklaruje się przy pomocy słowa kluczowego data:

public data class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}

Rekordy mają reprezentować dane, czyli wartości, które opakowują. By odgrywały właśnie taką rolę, mają kilka ciekawych właściwości. Równość rekordów wyznaczana jest na podstawie wartości, które zawierają, a nie na podstawie ich tożsamości. Kod pierwotnej definicji można jeszcze skrócić, bo domyślnie każda właściwość w rekordzie jest definiowana jako publiczna, z get oraz init.

public data class Person { string FirstName; string LastName; }

Rekordy mają wbudowane wyrażenie with, które pozwala na łatwe kopiowanie wartości z jednego rekordu do nowego przy jednoczesnej modyfikacji właściwości określonych przez użytkownika.

var otherPerson = person with { LastName = "Hanselman" };

Taka składania utworzy nową osobę otherPerson, o nazwisku Hanselman i skopiuje wszystkie pozostałe właściwości z person.


Krótkie programy

Najkrótszy program w C# wyglądał do tej pory mniej więcej tak jak w Javie:

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("Hello World!");
    }
}

W C# 9.0 można napisać ten sam program jako:

using System;

Console.WriteLine("Hello World!");

To nowy sposób zadeklarowania funkcji Main() na najwyższym poziomie, bez zagnieżdżania się i z mniejszą ilością kodu.


Typowanie na podstawie typu docelowego

W C# 9.0 można skrócić zapis wyrażenia new, o ile przypiszemy wartość wyrażenia, do zmiennej o ustalonym typie.

Point p = new (3, 5);


Ciekawe czy taki zapis spodoba się purystom ;)

Dodatkowo kompilator przestanie narzekać w przypadku wyrażeń ?? i ?:, jeżeli uda mu się ustalić wspólny typ dla obydwu argumentów, pomimo braku oczywistej klasy bazowej między nimi.

Person person = student ?? customer; // Shared base type
int? result = b ? 0 : null; // nullable value type


Ulepszone dopasowanie do wzorca

W C# 8.0 wprowadzono składnię dopasowania do wzorca, która jest bardzo podobna do wyrażeń lambda. C# 9.0 dostarcza kolejnych ulepszeń, które pozwalają pisać jeszcze bardziej idiomatyczny kod.

W przypadku, kiedy chcemy sprawdzić tylko typ, możemy pominąć definiowanie identyfikatora dla niego, więc zamiast:

fruit switch {
  Apple _ => "This is an apple",
  ...
};


Można napisać:

fruit switch {
  Apple => "This is an apple",
  ...
};

Wprowadzone zostały też operatory relacyjne (<, <=, itd.)  oraz logiczne (and, not). Dzięki nim kod stanie się jeszcze bardziej zwięzły:

DeliveryTruck t when t.GrossWeightClass switch
{
    < 3000 => 10.00m - 2.00m,
    >= 3000 and <= 5000 => 10.00m,
    > 5000 => 10.00m + 5.00m,
}



Podsumowanie

Oto najważniejsze ficzery nadchodzącego wydania C# 9.0. Rzeczy jest jeszcze trochę więcej, a ich pełna lista znajduje się tutaj oraz tutaj. Na stabilne wydanie trzeba będzie pewnie jeszcze trochę poczekać, ale już teraz można poczuć przedsmak nowości, które proponuje Microsoft.

<p>Loading...</p>