C#
Lekcje
programowania
Praktyczna nauka
programowania dla platform .NET i .NET Core
Książka, którą
trzymasz w ręku, to znakomity podręcznik do nauki programowania od
podstaw. Autor, wieloletni wykładowca akademicki i nauczyciel
studentów informatyki, proponuje naukę programowania w
języku C#. To wybór nieprzypadkowy. C# jest nowoczesnym,
obiektowym, stale rozwijanym i popularnym językiem, którym
opiekuje się firma Microsoft. Dodatkowo ― dzięki podobieństwu C# do
innych często używanych języków z rodziny C, C++ i Java ―
wszystko, czego nauczysz się z podręcznika, możesz wykorzystać także do
programowania w tych językach.
Zakres zagadnień omawianych w książce obejmuje:
- język programowania C#
6.0, w tym posługiwanie się zmiennymi, metodami, tablicami oraz
kolekcjami danych z platform .NET i .NET Core
- podstawowe techniki
programowania obiektowego
- różne formaty
przechowywania i eksportu danych
- darmowe środowisko
programistyczne Microsoft Visual Studio 2019 Community
- Jeżeli chcesz uczyć się
programować od podstaw ― to książka dla Ciebie.
Jeżeli znasz już podstawy, ale chcesz poznać C# oraz platformy .NET i
.NET Core ― to również dobry wybór.
Uwaga! Podręcznik zawiera ćwiczenia, w których krok po kroku
opisano tworzenie aplikacji konsolowych w darmowym Visual Studio 2019 i
omówiono ich kod, a także bogaty zestaw zadań do
samodzielnego wykonania!
Wstęp
17
CZĘŚĆ I.
PODSTAWY PROGRAMOWANIA 19
Rozdział 1.
Pierwszy kontakt ze środowiskiem Visual Studio 2019 i językiem C#
21
Projekt aplikacji konsolowej 22
Skróty klawiszowe Visual Studio 25
Podpowiadanie kodu (IntelliSense) 27
Strumienie wyjścia i wejścia 28
Wszystkiego po trochu 29
Pytania 32
Rozdział 2.
NET
Framework, .NET Core i .NET Standard 33
Pytania 36
Rozdział 3.
Podstawowe
typy danych 37
Deklaracja i zmiana wartości zmiennej 37
Typy liczbowe oraz typ znakowy 39
Określanie typu zmiennej przy inicjacji (pseudotyp var) 41
Operatory 42
Konwersje typów 45
Łańcuchy 46
String kontra StringBuilder 48
[Dla dociekliwych] Formatowanie łańcuchów 50
Typ wyliczeniowy 51
Ćwiczenia 52
Średnia arytmetyczna 52
Równanie kwadratowe 55
Łańcuchy 57
Pytania 57
Zadanie 58
Rozdział 4.
Metody 59
Parametry metody. Przeciążanie metod 60
Domyślne wartości argumentów metod - argumenty opcjonalne 61
Argumenty nazwane 62
Wartości zwracane przez metody 62
Zwracanie wartości przez argument metody 63
[Dla dociekliwych] Zagadnienia zaawansowane 65
[Dla dociekliwych] Delegacje 65
[Dla dociekliwych] Wyrażenia lambda 66
[Dla dociekliwych] Delegacje Action, Func i Predicate 68
[Dla dociekliwych] Caller Information 69
Ćwiczenia 71
Średnia arytmetyczna 71
Parzystość 71
Zamiana parametrów 72
[Dla dociekliwych] Metoda ogólna 73
Równanie kwadratowe 74
[Dla dociekliwych] Pochodne 75
Pytania 77
Rozdział 5.
Sterowanie
przepływem 79
Wybór 79
Instrukcja warunkowa if..else 79
Konstrukcja if..else..if 80
Instrukcja wyboru switch 81
[Dla dociekliwych] Nowa składnia switch 82
Powtarzanie 83
Pętla for 84
Pętla while 86
Przerywanie iteracji i pętli 88
Wyjątki 88
Przechwytywanie wyjątków 89
[Dla dociekliwych] Filtrowanie wyjątków 89
[Dla dociekliwych] Sekcja finally 90
Zgłaszanie wyjątków 91
[Dla dociekliwych] Dyrektywy preprocesora 92
Kompilacja warunkowa 92
Definiowanie stałych preprocesora 94
Bloki 95
[Dla dociekliwych] Atrybuty 96
Ćwiczenia 96
Pętla for 96
Liczba Eulera 98
Pytaj aż do skutku 101
Pytania 103
Zadania 104
Rozdział 6.
Wiele
hałasu o null 107
Typy wartościowe i referencyjne 107
Zwalnianie obiektów z pamięci 110
Nullable 114
[Dla dociekliwych] Leniwe inicjowanie zmiennych 116
Pudełkowanie 116
Operatory is i as 117
[Dla dociekliwych] Typy dynamiczne 118
Ćwiczenie 119
Pytania 120
Rozdział 7.
Tablice, pętle i pliki 121
Tablice 121
Pętla foreach 123
Wybór elementów z tablicy 123
Tablica jako argument metody 124
Podstawy 124
[Dla dociekliwych] Dwie ciekawostki 125
Sortowanie 126
Liczby losowe 126
Pliki tekstowe 128
Tablice dla typów referencyjnych 132
Inicjacja elementów tablicy 132
Pętla foreach 133
Sortowanie 133
Płytkie i głębokie kopiowanie 134
Ćwiczenia 135
Zabawa dwiema kostkami 135
Agregacja danych 136
Przeszukiwanie zbioru 138
[Dla dociekliwych] Zapowiedź LINQ 140
Sortowanie i mediana 141
[Dla dociekliwych] Histogram 143
Pytania 146
Zadania 146
Rozdział 8.
Tropienie
błędów 149
Program z błędem logicznym - pole do popisu dla debuggera 149
Kontrolowane uruchamianie aplikacji w Visual Studio 150
Śledzenie wykonywania programu krok po kroku (F10 i F11) 150
Run to Cursor (Ctrl+F10) 152
Punkt przerwania (F9) 152
Okna Automatyczne, Lokalne i Wyrażenie kontrolne 153
Stan wyjątkowy 156
Zgłaszanie wyjątków 156
Przechwytywanie wyjątków w konstrukcji try..catch 158
Wymuszenie kontroli zakresu zmiennych 159
Rozdział 9.
Kolekcje i krotki 161
Kolekcje 161
Lista 161
Słowniki 164
Kolejka i stos 165
[Dla dociekliwych] Iterator 166
[Dla dociekliwych] Słowo kluczowe yield 168
Krotki 169
Ćwiczenia 170
Równania kwadratowe 170
Filtrowanie liczb parzystych 172
Tłumaczenie 174
Pytania 177
Zadania 177
[Dla dociekliwych] Rozdział 10.
Maszyna Turinga 179
Maszyna Turinga 179
Dodawanie plików tekstowych do projektu 181
Analiza zapisu taśmy 182
Wczytywanie i parsowanie kodu programu 183
Wykonywanie programu 184
Argumenty linii komend 187
Dystrybucja programów 188
Zadania 189
CZĘŚĆ II.
PROGRAMOWANIE OBIEKTOWE
191
Rozdział 11.
Definiowanie typów
193
Po co definiować własne typy? 193
Pojęcia programowania obiektowego 195
Pola i metody 196
Konstruktor 197
Własności 197
Modyfikatory dostępu 198
Modyfikatory const i readonly 199
Klasa czy struktura? 200
Ćwiczenia 200
Przygotowywanie projektu 201
Konstruktor i statyczne pola 202
Pierwsze testy 204
Konwersje na łańcuch (metoda ToString) i na typ double 205
Nadpisywanie i przeciążanie metod 206
Metoda upraszczająca ułamek 206
Właściwości 208
Domyślnie implementowane właściwości 210
Operatory arytmetyczne 211
Operatory porównania oraz metody Equals i GetHashCode 213
Operatory konwersji 215
[Dla dociekliwych] Różne sposoby definiowania metod 216
[Dla dociekliwych] Operator potęgowania 217
Implementacja interfejsu IComparable<> 218
Pytania 221
Zadania 221
Rozdział 12.
Biblioteki DLL
225
Tworzenie zarządzanej biblioteki DLL 226
Dodawanie do aplikacji referencji do biblioteki DLL 229
[Dla dociekliwych] Dynamiczne ładowanie typów 230
[Dla dociekliwych] Pakiet NuGet 231
Pytania 233
Rozdział 13.
Testy jednostkowe
235
Projekt testów jednostkowych 236
Przygotowania do tworzenia testów 237
Pierwszy test jednostkowy 237
Uruchamianie testów 239
Dostęp do prywatnych pól testowanej klasy 240
Testowanie wyjątków 242
Kolejne testy weryfikujące otrzymane wartości 243
Test ze złożoną weryfikacją 244
Wielokrotnie powtarzane testy losowe 245
Niepowodzenie testu 246
Nieuniknione błędy 249
Pytania 252
Zadania 253
Rozdział 14.
Przykłady I 255
Rozwiązywanie równań kwadratowych 255
Wariant 1. 256
Wariant 2. 259
Wariant 3. 260
Dodatkowa optymalizacja 262
[Dla dociekliwych] Maszyna Turinga 2.0 264
Dwójka 264
Czwórka 266
Program 267
Stan 268
Maszyna 271
Rozruch 272
Wezwanie do refaktoryzacji 274
Statystyka 274
Biblioteka. Interfejs IEnumerable<> 275
Aplikacja 278
Zbiór parametrów statystycznych 280
Zadania 282
Rozdział 15.
Miscellanea
283
Rozszerzenia 283
Singleton 285
Klasa statyczna 285
Ukryty konstruktor 286
Leniwa inicjacja 288
Dopasowywanie wzorca 289
[Dla dociekliwych] Zdarzenia 290
[Dla dociekliwych] Typy anonimowe 293
[Dla dociekliwych] Uwaga na temat zwalniania pamięci w klasach 295
Ćwiczenia 298
Rozszerzenia. Dopełnienie imitacji LINQ 298
[Dla dociekliwych] Zdarzenia. Śledzenie zmian 300
Singleton. Rejestrowanie zdarzeń w aplikacji 302
Pytania 305
Zadania 305
[Dla dociekliwych]
Rozdział 16.
Typy ogólne
307
Definiowanie typów ogólnych 308
Określanie warunków, jakie mają spełniać parametry 309
Implementacja interfejsów przez typ ogólny 310
Definiowanie aliasów 312
Typy ogólne z wieloma parametrami 312
Kowariancja i kontrawariancja typów 314
Pytania 318
Rozdział 17.
Dziedziczenie i polimorfizm
319
Dziedziczenie 319
Klasy bazowe i klasy potomne 319
Kolejność wywoływania konstruktorów 322
Konwersja referencji do klasy bazowej 323
Nadpisywanie a przesłanianie metod 324
Polimorfizm 327
Klasy abstrakcyjne 327
Metody i własności wirtualne 330
Polimorfizm 332
Konstruktory a dziedziczenie raz jeszcze 334
Ćwiczenia 337
Relacje "jest" i "ma" 337
Nadpisywanie i przeciążanie metod 339
Zakres chroniony 340
Pytania 342
Zadania 342
Rozdział 18.
Interfejsy 345
Interfejsy jako "wspólny mianownik" 345
Interfejsy a klasy abstrakcyjne 347
Przykład 349
Interfejsy ogólne 350
Pytania 352
Zadania 352
Rozdział 19.
Klasa do klasy
353
SOLID 353
Zasada jednej odpowiedzialności 354
Zasada otwarte-zamknięte 357
Zasada podstawienia Liskov 359
Zasada segregacji interfejsów 363
Zasada odwrócenia zależności 365
Krótki komentarz na temat odwrócenia kontroli 368
Programowanie kontraktowe 369
GRASP 369
Zapachy kodu 371
Rozdział 20.
Przykłady II 373
Oprogramowanie dla działu kadr 373
Pracownik (liść) 373
Kierownik (gałąź) 374
Cykle 376
Odwiedzający 377
Wyświetlanie 380
Głębokość 381
Rozwiązanie problemu cykli 383
Spłaszczanie drzewa do listy 386
Zalety wzorców projektowych 387
Rozszerzenie parametrów statystycznych 388
Zadania 389
CZĘŚĆ III.
DANE W APLIKACJI
391
Rozdział 21.
Wzorzec MVC 393
Model 394
Kontroler 397
Widok 404
Stosowanie i wycofywanie zmian 405
Przerost formy nad treścią? 408
Zadania 409
Rozdział 22.
Przechowywanie danych w
plikach XML 411
Podstawy języka XML 411
Deklaracja 411
Elementy 412
Atrybuty 413
Komentarze 413
LINQ to XML 413
Tworzenie pliku XML za pomocą klas XDocument i XElement 413
Pobieranie wartości z elementów o znanej pozycji w drzewie
417
Pobieranie danych do kolekcji 418
Drzewo i rekurencja 424
Wyświetlanie drzewa w konsoli 426
Zadania 427
Rozdział 23.
LINQ 429
Operatory LINQ 429
Pobieranie danych (filtrowanie i sortowanie) 431
Analiza pobranych danych 433
Wybór elementu 433
Weryfikowanie danych 433
Prezentacja w grupach 434
Łączenie zbiorów danych 434
Łączenie danych z różnych źródeł (operator join)
435
Możliwość modyfikacji danych źródła 436
Zapisywanie danych z kolekcji do pliku XML 437
Zadania 439
Rozdział 24.
Serializacja do XML i JSON 441
XML 441
JSON 445
Zadanie 450
Rozdział 25.
CSV 451
Zapis kolekcji do pliku CSV 451
Kwestia przecinka 453
Odczytywanie danych 454
Uogólnienie 455
Zadania 458
Rozdział 26.
OpenXML (.docx) 461
Pakiet NuGet 461
Formatowania 462
Tekst 465
Tworzenie dokumentu 466
Rysunek 471
Tabela 476
Strumień w pamięci 480
Rozdział 27.
Entity Framework Core i SQLite
481
Instalacja pakietów NuGet 481
Klasy encji i relacje 482
Baza danych i tabele 484
Dodawanie rekordów do tabeli 486
Wyświetlanie rekordów 488
Usuwanie rekordów 491
Zmienianie danych w rekordzie 494
Pominięte zagadnienia 495
Inne scenariusze 496
Zadania 497
DODATKI
499
Dodatek A.
Informacje
o systemie 501
Informacje o środowisku aplikacji 501
Podstawowe informacje o systemie i profilu użytkownika 501
Katalogi specjalne zdefiniowane w bieżącym profilu użytkownika 502
Odczytywanie zmiennych środowiskowych 503
Lista dysków logicznych 504
Dodatek B.
Elementy
programowania współbieżnego
507
Równoległa pętla for 507
Przerywanie pętli 509
Programowanie asynchroniczne. Modyfikator async i operator await 510
Zadania 517
Dodatek C.
Git. Wersjonowanie i kopie bezpieczeństwa kodu źródłowego
519
Systemy kontroli wersji kodu źródłowego 519
Serwisy Git 521
Tworzenie projektu 523
Tworzenie nowej gałęzi 529
Wprowadzanie zmian w projekcie 529
Zatwierdzanie zmian 531
Wypychanie do repozytorium 531
Klonowanie projektu 533
Rozwiązywanie konfliktów (scalanie) 535
Scalanie gałęzi 541
Przywracanie wcześniejszej wersji projektu 544
O czym nie musimy wiedzieć, korzystając z Git w Visual Studio? 547
Dodatek D.
Co
nowego w C# 9.0? 549
Nowa inicjacja własności 549
Rekordy 553
Zmiany w instrukcji switch 558
Polecenia najwyższego poziomu 559
560
stron, 17.0x23.0cm, oprawa miękka