C# 10

Book description

Język C#, sztandarowe dzieło Microsoftu, jest rozwijany stopniowo i ze starannością. Wciąż cechuje go prostota, a jego możliwości konsekwentnie rosną. Każda nowa funkcjonalność idealnie integruje się z resztą języka. W efekcie C# jest dojrzały, nowoczesny, wszechstronny i bezpieczny. Jego kolejne wydanie, oznaczone numerem 10.0, różni się od poprzednich, więc aby programowanie w C# pozostało efektywne i satysfakcjonujące, trzeba opanować niuanse nowej wersji języka i narzędzi z nim związanych.

Ta książka jest uaktualnionym wydaniem wyczerpującego przewodnika dla doświadczonych programistów. Omawia ważne koncepcje języka C# i te jego tajniki, które rzadko kiedy są opisywane w poświęconych mu publikacjach. Uwzględnia najnowsze możliwości .NET 6 i C# w wersjach 9.0 i 10.0, z czego warto wymienić: rekordy, rozszerzone możliwości dopasowywania wzorców, a także nowe techniki upraszczania kodu w celu poprawy jego efektywności. Dokładnie opisano tu typy ogólne, LINQ i techniki programowania asynchronicznego. Wyjaśniono, jak w praktyce skorzystać z tych możliwości podczas tworzenia różnego rodzaju aplikacji: chmurowych, internetowych i klasycznych dla komputerów biurkowych.

W książce między innymi:

zmiany wprowadzone w ostatnich wersjach języka C#
zasady korzystania z nowych możliwości języka
zastosowanie nowych funkcjonalności C# w tworzeniu aplikacji
nowe możliwości bibliotek klas .NET
zastosowanie bibliotek klas .NET do praktycznych zadań programistycznych
zwiększanie siły ekspresji kodu w C#

Poznaj sekretne tajniki C# i zostań mistrzem dobrego kodu!

Table of contents

  1. Wstęp
    1. Do kogo jest skierowana ta książka
    2. Stosowane konwencje
    3. Korzystanie z przykładów do książki
    4. Podziękowania
  2. Rozdział 1. Prezentacja C#
    1. Dlaczego C#?
      1. Kod zarządzany i CLR
      2. Ogólność jest preferowana względem specjalizacji
    2. Standardy oraz implementacje języka C#
      1. Wiele .NET-ów
      2. Cykle wydawnicze i wsparcie długoterminowe
      3. Użycie .NET Standard w celu tworzenia projektów działających w różnych wersjach .NET
    3. Visual Studio, Visual Studio Code oraz JetBrains Rider
    4. Anatomia prostego programu
      1. Pisanie testu jednostkowego
      2. Przestrzenie nazw
        1. Zagnieżdżone przestrzenie nazw
      3. Klasy
      4. Testy jednostkowe
    5. Podsumowanie
  3. Rozdział 2. Podstawy stosowania języka C#
    1. Zmienne lokalne
      1. Zakres
      2. Niejednoznaczności nazw zmiennych
      3. Instancje zmiennych lokalnych
    2. Instrukcje i wyrażenia
      1. Instrukcje
      2. Wyrażenia
    3. Komentarze i białe znaki
    4. Dyrektywy preprocesora
      1. Symbole kompilacji
      2. Dyrektywy #error oraz #warning
      3. Dyrektywa #line
      4. Dyrektywa #pragma
      5. Dyrektywa #nullable
      6. Dyrektywy #region i #endregion
    5. Podstawowe typy danych
      1. Typy liczbowe
        1. Konwersje liczb
        2. Konteksty sprawdzane
        3. Typ BigInteger
      2. Wartości logiczne
      3. Znaki i łańcuchy znaków
        1. Niezmienność łańcuchów znaków
        2. Metody modyfikujące łańcuchy znaków
        3. Formatowanie danych w łańcuchach
        4. Dosłowne literały łańcuchowe
      4. Krotki
        1. Dekonstrukcja krotek
      5. Dynamic
      6. Object
    6. Operatory
    7. Sterowanie przepływem
      1. Decyzje logiczne przy użyciu instrukcji if
      2. Wielokrotny wybór przy użyciu instrukcji switch
      3. Pętle: while i do
      4. Pętle znane z języka C
      5. Przeglądanie kolekcji przy użyciu pętli foreach
    8. Wzorce
      1. Łączenie i negacja wzorców
      2. Wzorce relacyjne
      3. Uzyskiwanie większej dokładności dzięki użyciu when
      4. Wzorce w wyrażeniach
    9. Podsumowanie
  4. Rozdział 3. Typy
    1. Klasy
      1. Składowe statyczne
      2. Klasy statyczne
    2. Rekordy
    3. Typy referencyjne i wartość null
      1. Eliminacja wartości pustych przy użyciu referencji, które ich nie akceptują
    4. Struktury
      1. Kiedy tworzyć typy wartościowe?
      2. Gwarantowanie niezmienności
      3. Typy record struct
    5. Klasy, struktury, rekordy czy krotki?
    6. Składowe
      1. Dostępność
      2. Pola
      3. Konstruktory
        1. Konstruktory domyślne i bezargumentowe
        2. Tworzenie łańcuchów konstruktorów
        3. Konstruktory statyczne
      4. Dekonstruktory
      5. Metody
        1. Przekazywanie argumentów przez referencję
        2. Zmienne referencyjne i wartości wynikowe
        3. Argumenty opcjonalne
        4. Przeciążanie metod
        5. Zmienna liczba argumentów i słowo kluczowe params
        6. Funkcje lokalne
        7. Funkcje, których ciałem jest wyrażenie
        8. Metody rozszerzeń
      6. Właściwości
        1. Właściwości i zmienne typy wartościowe
        2. Indeksatory
        3. Składnia inicjalizatorów
      7. Operatory
      8. Zdarzenia
      9. Typy zagnieżdżone
    7. Interfejsy
      1. Domyślne implementacje metod w interfejsach
    8. Typy wyliczeniowe
    9. Inne typy
    10. Typy anonimowe
    11. Typy i metody częściowe
    12. Podsumowanie
  5. Rozdział 4. Typy ogólne
    1. Typy ogólne
    2. Ograniczenia
      1. Ograniczenia typu
      2. Ograniczenia typu referencyjnego
      3. Ograniczenia typu wartościowego
      4. Wszystkie typy w hierarchii wartościowe dzięki ograniczeniu unmanaged
      5. Ograniczenie notnull
      6. Inne specjalne ograniczenia typów
      7. Stosowanie wielu ograniczeń
    3. Wartości przypominające zero
    4. Metody ogólne
      1. Wnioskowanie typu
    5. Typy ogólne i krotki
    6. Tajniki typów ogólnych
    7. Podsumowanie
  6. Rozdział 5. Kolekcje
    1. Tablice
      1. Inicjalizacja tablic
      2. Przeszukiwanie i sortowanie
      3. Tablice wielowymiarowe
        1. Tablice nieregularne
        2. Tablice prostokątne
      4. Kopiowanie i zmiana wielkości
    2. List<T>
    3. Interfejsy list i sekwencji
    4. Implementacja list i sekwencji
      1. Implementacja IEnumerable przy użyciu iteratorów
      2. Klasa Collection<T>
      3. Klasa ReadOnlyCollection<T>
    5. Odwołania do elementów z użyciem indeksów i zakresów
      1. System.Index
      2. System.Range
      3. Obsługa indeksów i zakresów we własnych typach danych
    6. Słowniki
      1. Słowniki posortowane
    7. Zbiory
    8. Kolejki i stosy
    9. Listy połączone
    10. Kolekcje współbieżne
    11. Kolekcje niezmienne
    12. Podsumowanie
  7. Rozdział 6. Dziedziczenie
    1. Dziedziczenie i konwersje
    2. Dziedziczenie interfejsów
    3. Typy ogólne
      1. Kowariancja i kontrawariancja
    4. System.Object
      1. Wszechobecne metody typu System.Object
    5. Dostępność i dziedziczenie
    6. Metody wirtualne
      1. Metody abstrakcyjne
      2. Dziedziczenie i wersje bibliotek
    7. Metody i klasy ostateczne
    8. Dostęp do składowych klas bazowych
    9. Dziedziczenie i tworzenie obiektów
    10. Rekordy
      1. Rekordy, dziedziczenie i słowo kluczowe with
    11. Specjalne typy bazowe
    12. Podsumowanie
  8. Rozdział 7. Cykl życia obiektów
    1. Mechanizm odzyskiwania pamięci
      1. Określanie osiągalności danych
      2. Przypadkowe problemy mechanizmu odzyskiwania pamięci
      3. Słabe referencje
      4. Odzyskiwanie pamięci
      5. Tryby odzyskiwania pamięci
      6. Tymczasowe zawieszanie odzyskiwania pamięci
      7. Przypadkowe utrudnianie scalania
      8. Wymuszanie odzyskiwania pamięci
    2. Destruktory i finalizacja
    3. Interfejs IDisposable
      1. Zwalnianie opcjonalne
    4. Pakowanie
      1. Pakowanie danych typu Nullable<T>
    5. Podsumowanie
  9. Rozdział 8. Wyjątki
    1. Źródła wyjątków
      1. Wyjątki zgłaszane przez API
      2. Błędy wykrywane przez środowisko uruchomieniowe
    2. Obsługa wyjątków
      1. Obiekty wyjątków
      2. Wiele bloków catch
      3. Filtry wyjątków
      4. Zagnieżdżone bloki try
      5. Bloki finally
    3. Zgłaszanie wyjątków
      1. Powtórne zgłaszanie wyjątków
      2. Sposób na szybkie zakończenie aplikacji
    4. Typy wyjątków
    5. Wyjątki niestandardowe
    6. Wyjątki nieobsługiwane
    7. Podsumowanie
  10. Rozdział 9. Delegaty, wyrażenia lambda i zdarzenia
    1. Typy delegatów
      1. Tworzenie delegatów
      2. MulticastDelegate — delegaty zbiorowe
      3. Wywoływanie delegatów
      4. Popularne typy delegatów
      5. Zgodność typów
      6. Więcej niż składnia
    2. Funkcje anonimowe
      1. Przechwytywane zmienne
      2. Wyrażenia lambda oraz drzewa wyrażeń
    3. Zdarzenia
      1. Standardowy wzorzec delegatów zdarzeń
      2. Niestandardowe metody dodające i usuwające zdarzenia
      3. Zdarzenia i mechanizm odzyskiwania pamięci
      4. Zdarzenia a delegaty
    4. Delegaty a interfejsy
    5. Podsumowanie
  11. Rozdział 10. LINQ
    1. Wyrażenia zapytań
      1. Jak są rozwijane wyrażenia zapytań
      2. Obsługa wyrażeń zapytań
    2. Przetwarzanie opóźnione
    3. LINQ, typy ogólne oraz interfejs IQueryable<T>
    4. Standardowe operatory LINQ
      1. Filtrowanie
      2. Selekcja
        1. Kształtowanie danych oraz typy anonimowe
        2. Projekcje i odwzorowania
      3. Operator SelectMany
      4. Podział na części
      5. Określanie porządku
      6. Testy zawierania
      7. Konkretne elementy i podzakresy
      8. Agregacja
      9. Operacje na zbiorach
      10. Operatory działające na całych sekwencjach z zachowaniem kolejności
      11. Grupowanie
      12. Złączenia
      13. Konwersje
    5. Generowanie sekwencji
    6. Inne implementacje LINQ
      1. Entity Framework Core
      2. Parallel LINQ (PLINQ)
      3. LINQ to XML
      4. IAsyncEnumerable<T>
      5. Reactive Extensions
    7. Podsumowanie
  12. Rozdział 11. Reactive Extensions
    1. Podstawowe interfejsy
      1. Interfejs IObserver<T>
      2. Interfejs IObservable<T>
        1. Implementacja źródeł zimnych
        2. Implementacja źródeł ciepłych
    2. Publikowanie i subskrypcja z wykorzystaniem delegatów
      1. Tworzenie źródła przy wykorzystaniu delegatów
      2. Subskrybowanie obserwowalnych źródeł przy użyciu delegatów
    3. Generator sekwencji
      1. Empty
      2. Never
      3. Return
      4. Throw
      5. Range
      6. Repeat
      7. Generate
    4. Zapytania LINQ
      1. Operatory grupowania
      2. Operatory Join
      3. Operator SelectMany
      4. Agregacja oraz inne operatory zwracające jedną wartość
      5. Operator Concat
    5. Operatory biblioteki Rx
      1. Merge
      2. Operatory Buffer i Window
        1. Wyznaczanie okien przy użyciu obiektów obserwowalnych
      3. Operator Scan
      4. Operator Amb
      5. DistinctUntilChanged
    6. Mechanizmy szeregujące
      1. Określanie mechanizmów szeregujących
        1. ObserveOn
        2. SubscribeOn
        3. Jawne przekazywanie mechanizmów szeregujących
      2. Wbudowane mechanizmy szeregujące
    7. Tematy
      1. Subject<T>
      2. BehaviorSubject<T>
      3. ReplaySubject<T>
      4. AsyncSubject<T>
    8. Dostosowanie
      1. IEnumerable<T> i IAsyncEnumerable<T>
      2. Zdarzenia .NET
      3. API asynchroniczne
    9. Operacje z uzależnieniami czasowymi
      1. Interval
      2. Timer
      3. Timestamp
      4. TimeInterval
      5. Throttle
      6. Sample
      7. Timeout
      8. Operatory okien czasowych
      9. Delay
      10. DelaySubscription
    10. Reaqtor — Rx jako usługa
    11. Podsumowanie
  13. Rozdział 12. Podzespoły
    1. Anatomia podzespołu
      1. Metadane .NET
      2. Zasoby
      3. Podzespoły składające się z wielu plików
      4. Inne możliwości formatu PE
        1. Zasoby Win32
        2. Konsola kontra graficzny interfejs użytkownika
    2. Tożsamość typu
    3. Wczytywanie podzespołów
      1. Określanie podzespołów
      2. Jawne wczytywanie podzespołów
      3. Izolacja i obsługa wtyczek z użyciem typu AssemblyLoadContext
    4. Nazwy podzespołów
      1. Silne nazwy
      2. Numer wersji
      3. Numery wersji a wczytywanie podzespołów
      4. Identyfikator kulturowy
    5. Zabezpieczenia
    6. Platformy docelowe i .NET Standard
    7. Podsumowanie
  14. Rozdział 13. Odzwierciedlanie
    1. Typy odzwierciedlania
      1. Assembly
      2. Module
      3. MemberInfo
      4. Type i TypeInfo
        1. Typy ogólne
      5. MethodBase, ConstructorInfo oraz MethodInfo
      6. ParameterInfo
      7. FieldInfo
      8. PropertyInfo
      9. EventInfo
    2. Konteksty odzwierciedlania
    3. Podsumowanie
  15. Rozdział 14. Atrybuty
    1. Stosowanie atrybutów
      1. Cele atrybutów
      2. Atrybuty obsługiwane przez kompilator
        1. Nazwy i wersje
        2. Opis oraz inne, powiązane z nim zasoby
        3. Atrybuty z informacjami o kodzie wywołującym
      3. Atrybuty obsługiwane przez CLR
        1. InternalsVisibleToAttribute
        2. Kompilacja JIT
        3. STAThread oraz MTAThread
        4. Współdziałanie
    2. Definiowanie i stosowanie atrybutów niestandardowych
      1. Typy atrybutów
      2. Pobieranie atrybutów
      3. Wczytywanie jedynie metadanych
    3. Podsumowanie
  16. Rozdział 15. Pliki i strumienie
    1. Klasa Stream
      1. Położenie i poruszanie się w strumieniu
      2. Opróżnianie strumienia
      3. Kopiowanie
      4. Length
      5. Zwalnianie strumieni
      6. Operacje asynchroniczne
      7. Konkretne typy strumieni
      8. Jeden typ, wiele zachowań
    2. Dostęp swobodny i rozproszone/zebrane operacje wejścia-wyjścia bez klasy Stream
    3. Typy operujące na tekstach
      1. TextReader oraz TextWriter
      2. Konkretne typy do odczytu i zapisu łańcuchów znaków
        1. StreamReader oraz StreamWriter
        2. StringReader oraz StringWriter
      3. Kodowanie
        1. Kodowania wykorzystujące strony kodowe
        2. Bezpośrednie stosowanie różnych sposobów kodowania
    4. Pliki i katalogi
      1. Klasa FileStream
      2. Klasa File
      3. Klasa Directory
      4. Klasa Path
      5. Klasy FileInfo, DirectoryInfo oraz FileSystemInfo
      6. Znane katalogi
    5. Serializacja
      1. Klasy BinaryReader i BinaryWriter
      2. Serializacja CLR
      3. JSON
        1. JsonSerializer
        2. JSON DOM
    6. Podsumowanie
  17. Rozdział 16. Wielowątkowość
    1. Wątki
      1. Wątki, zmienne i wspólny stan
      2. Pamięć lokalna wątku
      3. Klasa Thread
      4. Pula wątków
        1. Uruchamianie prac przy wykorzystaniu klasy Task
        2. Heurystyki tworzenia wątków
      5. Powinowactwo do wątku oraz klasa SynchronizationContext
      6. Klasa ExecutionContext
    2. Synchronizacja
      1. Monitory oraz słowo kluczowe lock
        1. Jak jest przekształcana instrukcja lock
        2. Oczekiwanie i powiadomienia
        3. Limity czasu
      2. Klasa SpinLock
      3. Blokady odczytu i zapisu
      4. Obiekty zdarzeń
      5. Klasa Barrier
      6. Klasa CountdownEvent
      7. Semafory
      8. Muteksy
      9. Klasa Interlocked
      10. Leniwa inicjalizacja
        1. Klasa Lazy<T>
        2. Klasa LazyInitializer
      11. Pozostałe klasy obsługujące działania współbieżne
    3. Zadania
      1. Klasy Task i Task<T>
        1. Typy ValueTask i ValueTask<T>
        2. Opcje tworzenia zadań
        3. Statusy zadań
        4. Pobieranie wyników
      2. Kontynuacje
      3. Mechanizmy szeregujące
      4. Obsługa błędów
      5. Niestandardowe zadania bezwątkowe
      6. Związki zadanie nadrzędne — zadanie podrzędne
      7. Zadania złożone
    4. Inne wzorce asynchroniczne
    5. Anulowanie
    6. Równoległość
      1. Klasa Parallel
      2. Parallel LINQ
      3. TPL Dataflow
    7. Podsumowanie
  18. Rozdział 17. Asynchroniczne cechy języka
    1. Nowe słowa kluczowe: async i await
      1. Konteksty wykonania i synchronizacji
      2. Wykonywanie wielu operacji i pętli
        1. Generowanie asynchronicznych sekwencji i korzystanie z nich
        2. Asynchroniczne zwalnianie
      3. Zwracanie obiektu Task
      4. Stosowanie async w metodach zagnieżdżonych
    2. Wzorzec słowa kluczowego await
    3. Obsługa błędów
      1. Weryfikacja poprawności argumentów
      2. Wyjątki pojedyncze oraz grupy wyjątków
      3. Operacje równoległe i nieobsłużone wyjątki
    4. Podsumowanie
  19. Rozdział 18. Wydajne użytkowanie pamięci
    1. (Nie) kopiować!
    2. Reprezentacja elementów sekwencyjnych przy użyciu Span<T>
      1. Metody pomocnicze
      2. Tylko na stosie
    3. Reprezentacja elementów sekwencyjnych przy użyciu Memory<T>
    4. ReadOnlySequence<T>
    5. Przetwarzanie strumieni danych przy użyciu potoków
      1. Przetwarzanie danych JSON w ASP.NET Core
    6. Podsumowanie
    7. O autorze
    8. Kolofon

Product information

  • Title: C# 10
  • Author(s): Ian Griffiths
  • Release date: March 2023
  • Publisher(s): Helion
  • ISBN: 9788383222073