C# 8.0 Programowanie
Tworzenie aplikacji
Windows, internetowych oraz biurowych
Język
C# wciąż cechuje prostota, przy czym jego możliwości rosną z każdą
wersją. Od początku jest rozwijany z konsekwencją, a każda nowa
funkcjonalność idealnie integruje się z resztą języka. W efekcie C#
jest dojrzały, nowoczesny, wszechstronny i bezpieczny. Stanowi
integralną część platformy Microsoft .NET Framework. Profesjonalni
programiści, którzy dbają o wysoką jakość tworzonego kodu,
uważają C# i .NET za swoje ulubione narzędzie pracy. Wersja 8.0 tego
języka sprawia, że programowanie staje się jeszcze bardziej efektywne i
satysfakcjonujące. Pełne wykorzystanie tych imponujących możliwości
wymaga jednak mistrzowskiego opanowania subtelności
poszczególnych narzędzi i niuansów samego języka.
Ta
książka została napisana z myślą o doświadczonych programistach.
Podstawowe zagadnienia, takie jak klasy, polimorfizm i kolekcje,
znalazły się w kilku pierwszych rozdziałach, jednak zrozumienie treści
całej publikacji wymaga umiejętności technicznych. Została poświęcona
ważnym koncepcjom C# i tajnikom tego języka, które rzadko
kiedy są opisywane w literaturze. Dokładnie omówiono tu typy
ogólne, LINQ oraz techniki programowania asynchronicznego.
Przedstawiono najnowsze możliwości platformy .NET Core i języka C# 8.0,
takie jak strumienie asynchroniczne, referencje akceptujące wartości
puste, dopasowywanie wzorców, domyślne implementacje
interfejsów, zakresy, a także nową składnię indeksowania
oraz zmiany w narzędziach platformy .NET. Liczne rozbudowane przykłady
stanowią świetne uzupełnienie prezentowanych treści.
W tej książce między innymi:
- możliwości języka C#:
klasy, typy niestandardowe, kolekcje, obsługa błędów
- optymalizacja kodu pod
kątem wykorzystania pamięci
- praca na strumieniach
danych za pomocą technologii LINQ
- platforma .NET i
programowanie wielowątkowe
- programowanie
asynchroniczne a skalowalność aplikacji
Wstęp
15
1.
Prezentacja
C# 19
Dlaczego C#? 20
Najważniejsze cechy C# 21
Kod zarządzany i CLR 22
Ogólność jest preferowana względem specjalizacji 24
Standardy oraz implementacje języka C# 25
Kilka .NET-ów (chwilowo) 26
Użycie .NET Standard w celu tworzenia projektów działających
w różnych wersjach .NET 28
Visual Studio oraz Visual Studio Code 30
Anatomia prostego programu 33
Dodawanie projektu do istniejącego rozwiązania 36
Odwołania do innych projektów 37
Odwołania do bibliotek zewnętrznych 37
Pisanie testu jednostkowego 40
Przestrzenie nazw 43
Klasy 47
Punkt wejścia do programu 48
Testy jednostkowe 49
Podsumowanie 50
2.
Podstawy
stosowania języka C# 51
Zmienne lokalne 52
Zakres 57
Instrukcje i wyrażenia 61
Instrukcje 61
Wyrażenia 63
Komentarze i białe znaki 68
Dyrektywy preprocesora 70
Symbole kompilacji 70
Dyrektywy #error oraz #warning 72
Dyrektywa #line 72
Dyrektywa #pragma 73
Dyrektywa #nullable 74
Dyrektywy #region i #endregion 74
Podstawowe typy danych 75
Typy liczbowe 75
Wartości logiczne 86
Znaki i łańcuchy znaków 86
Krotki 92
Dynamic 95
Object 96
Operatory 96
Sterowanie przepływem 102
Decyzje logiczne przy użyciu instrukcji if 102
Wielokrotny wybór przy użyciu instrukcji switch 104
Pętle: while oraz do 106
Pętle znane z języka C 107
Przeglądanie kolekcji przy użyciu pętli foreach 109
Wzorce 110
Uzyskiwanie większej dokładności dzięki użyciu when 114
Wzorce w wyrażeniach 115
Podsumowanie 117
3.
Typy 119
Klasy 119
Składowe statyczne 123
Klasy statyczne 124
Typy referencyjne 125
Struktury 136
Kiedy tworzyć typy wartościowe? 140
Gwarantowanie niezmienności 145
Składowe 147
Pola 147
Konstruktory 149
Dekonstruktory 159
Metody 160
Właściwości 177
Indeksatory 183
Składnia inicjalizatorów 185
Operatory 186
Zdarzenia 189
Typy zagnieżdżone 189
Interfejsy 190
Domyślne implementacje metod w interfejsach 192
Typy wyliczeniowe 194
Inne typy 197
Typy anonimowe 198
Typy i metody częściowe 200
Podsumowanie 202
4.
Typy
ogólne 203
Typy ogólne 204
Ograniczenia 206
Ograniczenia typu 207
Ograniczenia typu referencyjnego 209
Ograniczenia typu wartościowego 212
Wszystkie typy w hierarchii wartościowe dzięki ograniczeniu unmanaged
212
Ograniczenie notnull 213
Inne specjalne ograniczenia typów 213
Stosowanie wielu ograniczeń 213
Wartości przypominające zero 214
Metody ogólne 215
Wnioskowanie typu 216
Typy ogólne i krotki 217
Tajniki typów ogólnych 218
Podsumowanie 220
5.
Kolekcje
221
Tablice 221
Inicjalizacja tablic 224
Przeszukiwanie i sortowanie 226
Tablice wielowymiarowe 233
Kopiowanie i zmiana wielkości 236
List 237
Interfejsy list i sekwencji 240
Implementacja list i sekwencji 246
Implementacja IEnumerable przy użyciu iteratorów 246
Klasa Collection 251
Klasa ReadOnlyCollection 252
Odwołania do elementów z użyciem indeksów i
zakresów 253
System.Index 253
System.Range 256
Obsługa indeksów i zakresów we własnych typach
danych 258
Słowniki 260
Słowniki posortowane 263
Zbiory 265
Kolejki i stosy 266
Listy połączone 267
Kolekcje współbieżne 268
Kolekcje niezmienne 269
Klasa ImutableArray 271
Podsumowanie 272
6.
Dziedziczenie
273
Dziedziczenie i konwersje 274
Dziedziczenie interfejsów 278
Typy ogólne 279
Kowariancja i kontrawariancja 280
System.Object 285
Wszechobecne metody typu System.Object 285
Dostępność i dziedziczenie 287
Metody wirtualne 288
Metody abstrakcyjne 290
Dziedziczenie i wersje bibliotek 291
Metody i klasy ostateczne 297
Dostęp do składowych klas bazowych 299
Dziedziczenie i tworzenie obiektów 299
Specjalne typy bazowe 303
Podsumowanie 305
7.
Cykl
życia obiektów 307
Mechanizm odzyskiwania pamięci 308
Określanie osiągalności danych 310
Przypadkowe problemy mechanizmu odzyskiwania pamięci 312
Słabe referencje 315
Odzyskiwanie pamięci 318
Tryby odzyskiwania pamięci 324
Tymczasowe zawieszanie odzyskiwania pamięci 328
Przypadkowe utrudnianie scalania 329
Wymuszanie odzyskiwania pamięci 332
Destruktory i finalizacja 333
Interfejs IDisposable 337
Zwalnianie opcjonalne 343
Pakowanie 344
Pakowanie danych typu Nullable 349
Podsumowanie 350
8.
Wyjątki
351
Źródła wyjątków 353
Wyjątki zgłaszane przez API 354
Błędy wykrywane przez środowisko uruchomieniowe 356
Obsługa wyjątków 357
Obiekty wyjątków 358
Wiele bloków catch 360
Filtry wyjątków 361
Zagnieżdżone bloki try 362
Bloki finally 364
Zgłaszanie wyjątków 365
Powtórne zgłaszanie wyjątków 366
Sposób na szybkie zakończenie aplikacji 370
Typy wyjątków 370
Wyjątki niestandardowe 373
Wyjątki nieobsługiwane 375
Podsumowanie 377
9.
Delegaty, wyrażenia lambda i zdarzenia
379
Typy delegatów 380
Tworzenie delegatów 381
MulticastDelegate - delegaty zbiorowe 384
Wywoływanie delegatów 386
Popularne typy delegatów 388
Zgodność typów 390
Więcej niż składnia 393
Funkcje anonimowe 395
Przechwytywane zmienne 398
Wyrażenia lambda oraz drzewa wyrażeń 405
Zdarzenia 407
Standardowy wzorzec delegatów zdarzeń 409
Niestandardowe metody dodające i usuwające zdarzenia 410
Zdarzenia i mechanizm odzyskiwania pamięci 413
Zdarzenia a delegaty 415
Delegaty a interfejsy 416
Podsumowanie 416
10.
LINQ
419
Wyrażenia zapytań 420
Jak są rozwijane wyrażenia zapytań 423
Obsługa wyrażeń zapytań 425
Przetwarzanie opóźnione 429
LINQ, typy ogólne oraz interfejs IQueryable 432
Standardowe operatory LINQ 434
Filtrowanie 436
Selekcja 438
Operator SelectMany 441
Określanie porządku 444
Testy zawierania 446
Konkretne elementy i podzakresy 448
Agregacja 452
Operacje na zbiorach 457
Operatory działające na całych sekwencjach z zachowaniem kolejności 458
Grupowanie 459
Złączenia 464
Konwersje 467
Generowanie sekwencji 471
Inne implementacje LINQ 472
Entity Framework 472
Parallel LINQ (PLINQ) 473
LINQ to XML 473
Reactive Extensions 473
Tx (LINQ to Logs and Traces) 473
Podsumowanie 474
11.
Reactive Extensions 475
Podstawowe interfejsy 477
Interfejs IObserver 478
Interfejs IObservable 479
Publikowanie i subskrypcja z wykorzystaniem delegatów 486
Tworzenie źródła przy wykorzystaniu delegatów 486
Subskrybowanie obserwowalnych źródeł przy użyciu
delegatów 489
Generator sekwencji 491
Empty 491
Never 491
Return 492
Throw 492
Range 492
Repeat 492
Generate 492
Zapytania LINQ 493
Operatory grupowania 496
Operatory Join 497
Operator SelectMany 503
Agregacja oraz inne operatory zwracające jedną wartość 503
Operator Concat 504
Operatory biblioteki Rx 505
Merge 505
Operatory Buffer i Window 507
Operator Scan 514
Operator Amb 515
DistinctUntilChanged 516
Mechanizmy szeregujące 516
Określanie mechanizmów szeregujących 517
Wbudowane mechanizmy szeregujące 519
Tematy 520
Subject 521
BehaviorSubject 522
ReplaySubject 523
AsyncSubject 523
Dostosowanie 524
IEnumerableoraz IAsyncEnumerable 524
Zdarzenia .NET 526
API asynchroniczne 528
Operacje z uzależnieniami czasowymi 530
Interval 530
Timer 531
Timestamp 532
TimeInterval 533
Throttle 533
Sample 534
Timeout 534
Operatory okien czasowych 534
Delay 535
DelaySubscription 536
Podsumowanie 536
12.
Podzespoły
537
Anatomia podzespołu 538
Metadane .NET 539
Zasoby 539
Podzespoły składające się z wielu plików 539
Inne możliwości formatu PE 540
Tożsamość typu 542
Wczytywanie podzespołów 545
Określanie podzespołów 546
Jawne wczytywanie podzespołów 550
Izolacja i obsługa wtyczek z użyciem typu AssemblyLoadContext 551
Nazwy podzespołów 553
Silne nazwy 553
Numer wersji 556
Identyfikator kulturowy 559
Zabezpieczenia 563
Podsumowanie 563
13.
Odzwierciedlanie 565
Typy odzwierciedlania 566
Assembly 567
Module 570
MemberInfo 572
Type oraz TypeInfo 574
MethodBase, ConstructorInfo oraz MethodInfo 580
ParameterInfo 581
FieldInfo 581
PropertyInfo 582
EventInfo 582
Konteksty odzwierciedlania 583
Podsumowanie 585
14.
Atrybuty
587
Stosowanie atrybutów 587
Cele atrybutów 589
Atrybuty obsługiwane przez kompilator 591
Atrybuty obsługiwane przez CLR 596
Definiowanie i stosowanie atrybutów niestandardowych 603
Typ atrybutu 604
Pobieranie atrybutów 606
Podsumowanie 609
15.
Pliki
i strumienie 611
Klasa Stream 612
Położenie i poruszanie się w strumieniu 614
Opróżnianie strumienia 615
Kopiowanie 616
Length 616
Zwalnianie strumieni 617
Operacje asynchroniczne 618
Konkretne typy strumieni 619
Jeden typ, wiele zachowań 620
Typy operujące na tekstach 622
TextReader oraz TextWriter 622
Konkretne typy do odczytu i zapisu łańcuchów
znaków 624
Kodowanie 627
Pliki i katalogi 631
Klasa FileStream 631
Klasa File 634
Klasa Directory 638
Klasa Path 639
Klasy FileInfo, DirectoryInfo oraz FileSystemInfo 641
Znane katalogi 642
Serializacja 643
Klasy BinaryReader oraz BinaryWriter 644
Serializacja CLR 645
JSON.NET 647
Podsumowanie 652
16.
Wielowątkowość
653
Wątki 653
Wątki, zmienne i wspólny stan 655
Klasa Thread 661
Pula wątków 663
Powinowactwo do wątku oraz klasa SynchronizationContext 666
Synchronizacja 670
Monitory oraz słowo kluczowe lock 671
Klasa SpinLock 677
Blokady odczytu i zapisu 680
Obiekty zdarzeń 681
Klasa Barrier 684
Klasa CountdownEvent 685
Semafory 685
Muteksy 686
Klasa Interlocked 686
Leniwa inicjalizacja 689
Pozostałe klasy obsługujące działania współbieżne 691
Zadania 693
Klasy Task oraz Task 693
Kontynuacje 699
Mechanizmy szeregujące 701
Obsługa błędów 703
Niestandardowe zadania bezwątkowe 703
Związki zadanie nadrzędne - zadanie podrzędne 705
Zadania złożone 705
Inne wzorce asynchroniczne 706
Anulowanie 707
Równoległość 708
Klasa Parallel 708
Parallel LINQ 709
TPL Dataflow 710
Podsumowanie 710
17.
Asynchroniczne
cechy języka 711
Nowe słowa kluczowe: async oraz await 712
Konteksty wykonania i synchronizacji 716
Wykonywanie wielu operacji i pętli 718
Zwracanie obiektu Task 724
Stosowanie async w metodach zagnieżdżonych 726
Wzorzec słowa kluczowego await 726
Obsługa błędów 731
Weryfikacja poprawności argumentów 733
Wyjątki pojedyncze oraz grupy wyjątków 735
Operacje równoległe i nieobsłużone wyjątki 736
Podsumowanie 738
18.
Wydajne
użytkowanie pamięci 739
(Nie) kopiować! 740
Reprezentacja elementów sekwencyjnych przy użyciu Span 744
Metody pomocnicze 747
Tylko na stosie 747
Reprezentacja elementów sekwencyjnych przy użyciu Memory 748
ReadOnlySequence 748
Przetwarzanie strumieni danych przy użyciu potoków 749
Przetwarzanie danych JSON w ASP.NET Core 751
Podsumowanie 757
760
stron, Format: 17.0x24.0cm, oprawa miękka