Tak jak pisałem wcześniej, wole napisać o nowościach jak już je dobrze poznam więc stąd takie opóźnienie. Po drugie cześć osób i tak nie używa wszystkich nowości, bo tak gwałtownie wychodzą więc warto co jakiś czas o tym napisać aby przypomnieć sobie. Zapraszam na nowości w C# 8 , które weszły w 2019 roku. Napisałem je w skróconej wersji z małymi komentarzami aby było łatwiej je zapamiętać.
Spis treści
- Indeksy i zakresy
- Null-coalescing assigment
- Deklaracje using
- Modyfikator readonly w strukturach
- Domyślnie metody w interfejsach
- Wyrażenie switch
- Tuple patterns, positional patterns i property patterns
- Nulowalne typy referencyjne
- Asynchroniczne strumienie
Indeksy i zakresy
Dodano ułatwienia w pracy nad elementami lub całymi zakresami wartości tablicowych.
Wprowadzony indeksy oznaczone jako ^1 jako ostatni element, ^2 jako drugi od końca element itd.
Możemy też dzielić tablice na części tak jak sobie życzym.
Powstały też typy, w których można przechowywać te wyrażenia
Null-coalescing assigment
Od teraz można przypisywać do zmiennej jeżeli jest null-em w tenm sposób
Deklaracje using
Od teraz możemy w deklaracjach using zrezygnować z nawiasów i postawić na końcu średnik. Funkcja using przez cały czas będzie działać a metoda dispose wywoła się po wyjściu z danego bloku kodu. Czyli w tym przypadku po wyjściu z deklaracji if-a
Modyfikator readonly w strukturach
Od teraz możemy w metodach w strukturze zadeklarować, iż dana metoda nie może zmieniać pól.
Domyślnie metody w interfejsach
Jeden przykład 1000 słów. od dzisiaj można zdefiniować domyślnie implementacje metod w interfejsach, dzięki temu nie musimy nic zmieniać w implementacjach już istniejących w klasach.
Aby jednak wykonać taką metoda trzeba ją wywołać explicitly
Można też definiować statyczne pola, które będą dostępne w danej implementacji metody w interfejsie albo…
…na zewnątrz poprzez interfejs.
Wyrażenie switch
Od teraz można korzystać z instrukcji switch w wyrażeniach (czyli tak jak by w jednej długiej instrukcji)
Z doświadczenia wiem, iż warto zapamiętać, iż po danym case-sie, należy wstawić przecinek, jest to czasem frustrujące gdy nie chce się skompilować, bo komunikat nie zawsze jest taki oczywisty.
Tuple patterns, positional patterns i property patterns
Od teraz C# 8 wspiera trzy nowe wyrażenia, wszystkie wiążą się głownie z instrukcją switch choć nie zawsze.
Tuple patterns i positional patterns (pozwalające na dekonstruowanie wyrażeń na tuple)
Positional patterns
Pozwalają sprawdzić obiekt razem z jego polami
Nulowalne typy referencyjne
Od teraz można a adekwatnie to trzeba przy projekcie zdecydować jak się podchodzi o typów, które mogą być NULL-em. Można teraz zmusić kompilator do tego aby dawał ostrzeżenia jeżeli dany typ nie jest zaznaczony, iż może być nullowalny wprost.
Wygląda dość niewinnie ale w projekcie zaczyna być z tym pewnie zamieszanie. VS dużo podkreśla i co chwilę trzeba sprawdzić czy to błąd czy tylko ostrzeżenie. Czasem ciężko się domyśleć czy i dlaczego podkreśla i wysyła ostrzeżenie, bo w kodzie wygląda tak, iż dana wartość nie może przyjąć null-a.
Ostrzeżenie zniknie, jeżeli damy znać kompilatorowi, iż wiemy co robimy
Przydatny tez okazuje się operator !, który umożliwia przerwanie ciągu wywoływań kolejnych pól i metod gdy dana wartość jest null-em
Wtedy wystarczy dodać ! i po sprawie
Asynchroniczne strumienie
Od teraz można używać razem wyrażeń await w strumieniach, które zwracają elementy poprzez słowo najważniejsze yield. Wcześniej nie było takiej możliwości
Podsumowanie
Podczas pisania o tych nowościach przypominało mi się, gdzie je mogłem zastosować a tego nie zrobiłem. Patrząc na to z takiej odległej perspektywy to wyraźnie widać, iż fakt jest to spory rozwój, a nie aż tak wielki jak by się mogło wydawać. Pytanie dlaczego? Może te zmiany idą w jakiś kierunku a nie koniecznie w takim w którym, najczęściej się idzie piszą programy w .NET-cie. Wiele zmian jest bardzo takich skryptowych, ułatwiających pisanie kodu zwięzłego i nie czytelnego (wyrażenie switch, potrafią być dość duże, indeksy i zakresy). Tak czy inaczej warto je znać, bo zawsze się to przydaje na…hackathon-ach : )