C# 8.0
Kompletny
przewodnik dla praktyków
C#
jest jednym z najlepszych dzieł Microsoftu - cechuje go dojrzałość,
prostota i nowoczesność. Został zaprojektowany jako język obiektowy i
konsekwentnie jest rozwijany. Służy do tworzenia aplikacji sieciowych,
mikrousług, aplikacji desktopowych, oprogramowania dla urządzeń
mobilnych i internetu rzeczy. Ponadto C# jest językiem otwartym,
pozwalającym na pisanie kodu bezpiecznego, przejrzystego, wydajnego i
prostego w konserwacji. W wersji 8.0 pojawiły się funkcjonalności,
które jeszcze bardziej usprawniają pracę programisty.
To
siódme, zaktualizowane i uzupełnione wydanie jednego z
najlepszych podręczników programowania, docenianego przez
programistów na każdym poziomie zaawansowania. Poza
znakomitym samouczkiem języka C# znalazły się tu informacje o
poszczególnych metodykach programowania. Książka zawiera
także omówienie nowości w C#: typów
referencyjnych dopuszczających wartość null, indeksów,
przedziałów, rozbudowanego dopasowywania do wzorca,
strumieni asynchronicznych i innych. Treść jest uporządkowana i
przejrzysta, co nadaje podręcznikowi przystępną formę, a zawarte w nim
wskazówki pomagają w ograniczeniu liczby błędów w
kodzie.
W książce między innymi:
- istotne konstrukcje w C#
- techniki programowania
obiektowego w C#, w tym klasy, dziedziczenie i interfejsy
- typy generyczne, delegaty,
wyrażenia lambda oraz refleksje i atrybuty
- strumienie asynchroniczne
- przetwarzanie
równoległe i wielowątkowość
- współdziałanie
z kodem niezarządzanym
Spis
rysunków 11
Spis tabel 13
Przedmowa 15
Wprowadzenie 17
O autorze 28
Podziękowania 29
1.
Wprowadzenie
do języka C# 31
Witaj, świecie 32
Podstawy składni języka C# 42
Korzystanie ze zmiennych 49
Dane wejściowe i wyjściowe w konsoli 52
Wykonywanie kodu w środowisku zarządzanym iplatforma CLI 59
Różne wersje platformy .NET 63
Podsumowanie 67
2.
Typy danych 69
Podstawowe typy liczbowe 69
Inne podstawowe typy 77
Konwersje typów danych 91
Podsumowanie 97
3.
Jeszcze
o typach danych 99
Kategorie typów 99
Deklarowanie typów umożliwiających stosowanie wartości null
102
Zmienne lokalne z niejawnie określanym typem danych 106
Krotki 108
Tablice 114
Podsumowanie 130
4.
Operatory
i przepływ sterowania 131
Operatory 132
Zarządzanie przepływem sterowania 145
Bloki kodu ({}) 150
Bloki kodu, zasięgi i przestrzenie deklaracji 152
Wyrażenia logiczne 154
Programowanie z użyciem wartości null 158
Operatory bitowe (<<, >>, |, &, ^,
~) 164
Instrukcje związane z przepływem sterowania - ciąg dalszy 169
Instrukcje skoku 179
Dyrektywy preprocesora języka C# 184
Podsumowanie 191
5.
Metody
i parametry 193
Wywoływanie metody 194
Deklarowanie metody 199
Dyrektywa using 204
Zwracane wartości i parametry metody Main() 208
Zaawansowane parametry metod 211
Rekurencja 220
Przeciążanie metod 223
Parametry opcjonalne 226
Podstawowa obsługa błędów z wykorzystaniem
wyjątków 229
Podsumowanie 241
6.
Klasy 243
Deklarowanie klasy i tworzenie jej instancji 246
Pola instancji 249
Metody instancji 251
Stosowanie słowa kluczowego this 252
Modyfikatory dostępu 258
Właściwości 260
Konstruktory 274
Konstruktory a właściwości typów referencyjnych
niedopuszczających wartości null 283
Atrybuty dopuszczające wartość null 286
Dekonstruktory 288
Składowe statyczne 290
Metody rozszerzające 298
Hermetyzacja danych 299
Klasy zagnieżdżone 302
Klasy częściowe 304
Podsumowanie 308
7.
Dziedziczenie
309
Tworzenie klas pochodnych 310
Przesłanianie składowych z klas bazowych 318
Klasy abstrakcyjne 328
Wszystkie klasy są pochodne od System.Object 334
Dopasowanie do wzorca za pomocą operatora is 335
Dopasowanie do wzorca w wyrażeniu switch 340
Unikaj dopasowania do wzorca, gdy możliwy jest polimorfizm 341
Podsumowanie 343
8.
Interfejsy
345
Wprowadzenie do interfejsów 346
Polimorfizm oparty na interfejsach 347
Implementacja interfejsu 351
Przekształcanie między klasą z implementacją i interfejsami 356
Dziedziczenie interfejsów 356
Dziedziczenie po wielu interfejsach 359
Metody rozszerzające i interfejsy 359
Zarządzanie wersjami 361
Metody rozszerzające a domyślne składowe interfejsu 374
Interfejsy a klasy abstrakcyjne 375
Interfejsy a atrybuty 377
Podsumowanie 377
9.
Typy
bezpośrednie 379
Struktury 383
Opakowywanie 388
Wyliczenia 395
Podsumowanie 405
10.
Dobrze
uformowane typy 407
Przesłanianie składowych z klasy object 407
Przeciążanie operatorów 418
Wskazywanie innych podzespołów 425
Hermetyzacja typów 431
Definiowanie przestrzeni nazw 433
Komentarze XML-owe 436
Odzyskiwanie pamięci 440
Porządkowanie zasobów 443
Leniwe inicjowanie 455
Podsumowanie 457
11.
Obsługa
wyjątków 459
Wiele typów wyjątków 459
Przechwytywanie wyjątków 462
Ponowne zgłaszanie przetwarzanego wyjątku 463
Ogólny blok catch 465
Wskazówki związane z obsługą wyjątków 466
Definiowanie niestandardowych wyjątków 469
Ponowne zgłaszanie opakowanego wyjątku 471
Podsumowanie 475
12.
Typy
generyczne 477
Język C# bez typów generycznych 478
Wprowadzenie do typów generycznych 482
Ograniczenia 493
Metody generyczne 507
Kowariancja i kontrawariancja 511
Wewnętrzne mechanizmy typów generycznych 517
Podsumowanie 521
13.
Delegaty
i wyrażenia lambda 523
Wprowadzenie do delegatów 524
Deklarowanie typu delegata 527
Wyrażenia lambda 534
Lambdy w postaci instrukcji 535
Metody anonimowe 539
Delegaty nie zapewniają równości strukturalnej 541
Zmienne zewnętrzne 543
Drzewo wyrażeń 547
Podsumowanie 553
14.
Zdarzenia 555
Implementacja wzorca publikuj-subskrybuj za pomocą delegatów
typu multicast 556
Zdarzenia 569
Podsumowanie 578
15.
Interfejsy
kolekcji ze standardowymi operatorami kwerend
579
Inicjatory kolekcji 580
Interfejs IEnumerablesprawia, że klasa staje się kolekcją 582
Standardowe operatory kwerend 587
Typy anonimowe w technologii LINQ 615
Podsumowanie 622
16.
Technologia
LINQ i wyrażenia z kwerendami 623
Wprowadzenie do wyrażeń z kwerendami 624
Wyrażenia z kwerendą to tylko wywołania metod 639
Podsumowanie 641
17.
Tworzenie
niestandardowych kolekcji 643
Inne interfejsy implementowane w kolekcjach 644
Podstawowe klasy kolekcji 646
Udostępnianie indeksera 661
Zwracanie wartości null lub pustej kolekcji 664
Iteratory 665
Podsumowanie 677
18.
Refleksja,
atrybuty i programowanie dynamiczne
679
Mechanizm refleksji 680
Operator nameof 689
Atrybuty 690
Programowanie z wykorzystaniem obiektów dynamicznych 705
Podsumowanie 714
19.
Wprowadzenie
do wielowątkowości 717
Podstawy wielowątkowości 719
Zadania asynchroniczne 724
Anulowanie zadania 741
Używanie przestrzeni nazw System.Threading 746
Podsumowanie 748
20.
Programowanie
z wykorzystaniem wzorca TAP
749
Synchroniczne wykonywanie operacji o wysokiej latencji 750
Asynchroniczne wywoływanie operacji o dużej latencji za pomocą
biblioteki TPL 752
Asynchroniczność oparta na zadaniach oraz instrukcjach async i await 756
Dodanie możliwości zwracania typu ValueTaskw metodach asynchronicznych
761
Strumienie asynchroniczne 763
Interfejs IAsyncDisposable a deklaracje i instrukcje await using 766
Używanie technologii LINQ razem z interfejsem IAsyncEnumerable 767
Zwracanie wartości void w metodach asynchronicznych 769
Asynchroniczne lambdy i funkcje lokalne 772
Programy szeregujące zadania i kontekst synchronizacji 777
Modyfikatory async i await w programach z interfejsem użytkownika z
systemu Windows 779
Podsumowanie 782
21.
Równoległe
iteracje 783
Równoległe wykonywanie iteracji pętli 783
Równoległe wykonywanie kwerend LINQ 791
Podsumowanie 796
22.
Synchronizowanie
wątków 797
Po co stosować synchronizację? 798
Zegary 822
Podsumowanie 823
23.
Współdziałanie między platformami i niezabezpieczony kod 825
Mechanizm P/Invoke 826
Wskaźniki i adresy 837
Wykonywanie niezabezpieczonego kodu za pomocą delegata 845
Podsumowanie 846
24.
Standard
CLI 847
Definiowanie standardu CLI 847
Implementacje standardu CLI 848
Specyfikacja .NET Standard 851
Biblioteka BCL 851
Kompilacja kodu w języku C# na kod maszynowy 852
Środowisko uruchomieniowe 853
Podzespoły, manifesty i moduły 857
Język Common Intermediate Language 859
Common Type System 860
Common Language Specification 861
Metadane 861
Architektura .NET Native i kompilacja AOT 862
Podsumowanie 862
864
strony, oprawa twarda