Autor: Jay Hilyard, Stephen Teilhet
ISBN: 978-83-7541-160-7
Ilość stron: 768
Data wydania: 12/2015 (wydanie 4)
Oprawa: Miękka
Format: 17.0x23.0cm
Wydawnictwo: Promise
Nowe wydanie bestsellerowej książki, w pełni zaktualizowane do wersji C# 6.0, oferuje ponad 150 użytecznych rozwiązań dla typowych i nie aż tak typowych problemów, z którymi muszą sobie radzić programiści C# w codziennej pracy. Większość przykładów zostało przypisanych z wykorzystaniem nowych funkcjonalności C# 6.0.
To lektura obowiązkowa dla każdego programisty preferującego ogólniejsze rozwiązania języka C# i szukającego szybkich odpowiedzi na teoretyczne pytania. C# 6.0 Księga przepisów udostępnia nowe przepisy dla metod asynchronicznych, obiektów dynamicznych, zaawansowanej obsługi błędów, kompilatora Rosyln i jeszcze więcej.
Niektóre z omawianych zagadnień:
• Klasy i typy ogólne
• Kolekcje, wyliczenia i iteratory
• Typy danych
• Wyrażenia LINQ i Lambda
• Obsługa wyjątków
• Odbicia i programowanie dynamiczne
• Wyrażenia regularne
• Interakcja z systemem plików
• Praca w sieci i Web
• Wykorzystanie XML
• Wątkowanie, synchronizacja i współbieżność
Każdy przepis w książce zawiera przetestowany kod, który można pobrać z witryny oreilly.com i wykorzystać we własnych aplikacjach, przy czym do każdego z nich dołączone jest szczegółowe wyjaśnienie, jak i dlaczego działa pokazana technika. Do korzystania z książki i dołączonych przykładów nie trzeba być doświadczonym programistą C# lub .NET. Trzeba jedynie być kimś, kto chce rozwiązać problem już teraz, bez konieczności poznawania najpierw całej powiązanej teorii.
Spis treści:
1 Klasy i typy generyczne
1.0 Wprowadzenie 1
1.1 Tworzenie unii 3
1.2 Umożliwianie sortowania typu 6
1.3 Umożliwianie przeszukiwania typu 11
1.4 Zwracanie z metody wielu elementów 14
1.5 Parsowanie parametrów wiersza poleceń 18
1.6 Inicjowanie stałego pola w czasie wykonywania 31
1.7 Tworzenie klonowalnych klas 34
1.8 Zapewnianie prawidłowego usuwania obiektu 38
1.9 Kiedy i gdzie stosować typy generyczne 41
1.10 Wprowadzenie do typów generycznych 42
1.11 Odwracanie zawartości posortowanej listy 51
1.12 Ograniczanie argumentów typu 54
1.13 Inicjowanie zmiennych generycznych do ich domyślnych wartości 57
1.14 Dodawanie punktów zaczepienia do wygenerowanych obiektów 59
1.15 Kontrolowanie wywołań delegatów wewnątrz delegatu zbiorowego 62
1.16 Domknięcia w C#70
1.17 Wykonywanie operacji na listach za pomocą funktorów 76
1.18 Kontrolowanie inicjalizacji pól struktury 80
1.19 Bardziej przystępne sprawdzanie wartości null 85
2 Kolekcje, enumeratory i iteratory 89
2.0 Wprowadzenie
2.1 Wyszukiwanie zduplikowanych elementów na liście List 92
2.2 Utrzymywanie listy List w posortowanej postaci 97
2.3 Sortowanie kluczy i/lub wartości słownika 99
2.4 Tworzenie słownika z wartościami granicznymi 101
2.5 Utrwalanie kolekcji pomiędzy sesjami aplikacji 104
2.6 Testowanie elementów tablicy lub listy List 106
2.7 Tworzenie niestandardowych enumeratorów 108
2.8 Korzystanie z iteratorów i bloków finally 113
2.9 Implementowanie w klasie zagnieżdżonych pętli foreach 117
2.10 Korzystanie z bezpiecznego wątkowo słownika dla współbieżnego dostępu bez blokowania 122
3 Typy danych
3.0 Wprowadzenie 131
3.1 Kodowanie danych binarnych przy użyciu formatu Base64 133
3.2 Dekodowanie danych binarnych zakodowanych formatem Base64135
3.3 Powrotne konwertowanie łańcucha znaków zwróconego
z tablicy Byte[] do typu string 137
3.4 Przekazywanie łańcucha znaków do metody przyjmującej wyłącznie Byte[] 138
3.5 Sprawdzanie, czy łańcuch znakowy jest poprawną liczbą 140
3.6 Zaokrąglanie wartości zmiennoprzecinkowej 141
3.7 Wybieranie algorytmu zaokrąglania 142
3.8 Bezpieczne wykonywanie zawężającego rzutowania numerycznego 143
3.9 Testowanie pod kątem poprawności wartości typu wyliczeniowego 146
3.10 Wykorzystywanie członków typów wyliczeniowych w masce bitowej 149
3.11 Sprawdzanie, czy któraś z flag typu wyliczeniowego została ustawiona 152
4 Zapytania LINQ i wyrażenia lambda
4.0 Wprowadzenie 157
4.1 Odpytywanie kolejki komunikatów 160
4.2 Praca z danymi z wykorzystaniem semantyki zbiorów 165
4.3 Ponowne wykorzystywanie sparametryzowanych zapytań LINQ do SQL 170
4.4 Sortowanie wyników w zależności od kultury 172
4.5 Dodawanie rozszerzeń funkcjonalnych do wykorzystania w LINQ176
4.6 Odpytywanie i łączenie różnych repozytoriów danych180
4.7 Pozyskiwanie danych z plików konfiguracyjnych przy użyciu LINQ184
4.8 Tworzenie kodu XML bezpośrednio z bazy danych 187
4.9 Selektywne wybieranie wyników zapytania 202
4.10 LINQ i kolekcje niewspierające interfejsu IEnumerable 206
4.11 Zaawansowane wyszukiwanie interfejsu 208
4.12 Korzystanie z wyrażeń lambda 211
4.13 Korzystanie w wyrażeniach lambda z innych modyfikatorów parametrów 216
4.14 Przyspieszanie operacji LINQ z użyciem współbieżności 220
5 Debugowanie i obsługa wyjątków
5.0 Wprowadzenie 233
5.1 Wyłapywanie i ponowne rzucanie wyjątków 241
5.2 Obsługa wyjątków rzucanych z metod wywołanych w ramach odbicia 243
5.3 Tworzenie nowego typu wyjątku 246
5.4 Przerywanie na wyjątku pierwszej szansy 256
5.5 Obsługiwanie wyjątków rzucanych z asynchronicznego delegatu 261
5.6 Dodawanie do wyjątków dodatkowych informacji z użyciem właściwości Exception.Data 263
5.7 Praca z nieobsłużonymi wyjątkami w aplikacjach WinForms 266
5.8 Praca z nieobsłużonymi wyjątkami w aplikacjach WPF 268
5.9 Ustalanie, czy proces przestał odpowiadać 271
5.10 Korzystanie w aplikacji z dzienników zdarzeń 273
5.11 Monitorowanie dziennika zdarzeń pod kątem konkretnego wpisu 286
5.12 Implementowanie prostego licznika wydajności 287
5.13 Tworzenie niestandardowych wyświetlaczy debugowania dla naszych klas 291
5.14 Wykrywanie miejsca powstania wyjątku 293
5.15 Obsługa wyjątków w scenariuszach asynchronicznych297
5.16 Selektywne przetwarzanie wyjątków 304
6 Odbicie i programowanie dynamiczne
6.0 Wprowadzenie 309
6.1 Listowanie wykorzystywanych zestawów 310
6.2 Określanie charakterystyki typów w zestawach 316
6.3 Określanie charakterystyki dziedziczenia 321
6.4 Wywoływanie członków z użyciem odbicia 327
6.5 Pozyskiwanie informacji ze zmiennej lokalnej 332
6.6 Tworzenie typu generycznego 335
6.7 Różnica pomiędzy dynamic a object 337
6.8 Dynamiczne tworzenie obiektów 340
6.9 Modyfikowanie obiektów pod kątem rozszerzalności 345
7 Wyrażenia regularne
7.0 Wprowadzenie 357
7.1 Wyodrębnianie grup z obiektu MatchCollection 358
7.2 Weryfikowanie składni wyrażeń regularnych 362
7.3 Rozszerzanie podstawowej funkcji zamiany tekstu 364
7.4 Implementowanie lepszego tokenizatora 367
7.5 Zwracanie pełnego wiersza, w którym znaleziono dopasowanie 369
7.6 Wyszukiwanie określonych wystąpień dopasowania 374
7.7 Korzystanie z powszechnych wzorców 376
8 Operacje wejścia-wyjścia w systemie plików
8.0 Wprowadzenie 381
8.1 Wyszukiwanie katalogów lub plików za pomocą znaków wieloznacznych 382
8.2 Uzyskiwanie drzewa katalogów388
8.3 Parsowanie ścieżki393
8.4 Uruchamianie i używanie narzędzi konsoli 395
8.5 Blokowanie fragmentów pliku 397
8.6 Oczekiwanie na wystąpienie akcji w systemie plików402
8.7 Porównywanie informacji o wersji dwóch modułów wykonywalnych 405
8.8 Wyszukiwanie informacji o wszystkich nośnikach dostępnych w systemie 408
8.9 Kompresja i dekompresja plików 411
9 Zagadnienia sieciowe
9.0 Wprowadzenie 423
9.1 Obsługa błędów serwera WWW 424
9.2 Komunikacja z serwerem WWW 426
9.3 Przekazywanie żądań przez proxy 428
9.4 Pobieranie HTML na podstawie adresu URL 430
9.5 Używanie kontrolki przeglądarki internetowej 431
9.6 Prekompilacja strony ASP.NET z poziomu programu 434
9.7 Stosowanie sekwencji specjalnych i ich usuwanie z danych dla sieci WWW 438
9.8 Sprawdzanie niestandardowych stron błędów serwera WWW 440
9.9 Tworzenie serwera TCP 445
9.10 Tworzenie klienta TCP 455
9.11 Symulacja przesłania formularza 464
9.12 Przesyłanie danych za pośrednictwem HTTP 468
9.13 Komunikacja z wykorzystaniem potoków nazwanych 472
9.14 Pingowanie z poziomu kodu 481
9.15 Wysyłanie poczty SMTP z wykorzystaniem usługi SMTP 483
9.16 Skanowanie portów na komputerze za pomocą gniazd486
9.17 Wykorzystanie bieżących ustawień internetowych 491
9.18 Przenoszenie plików za pomocą FTP 499
10 XML
10.0 Wprowadzenie 503
10.1 Odczyt i dostęp do danych XML w kolejności zdefiniowanej w dokumencie 504
10.2 Przeszukiwanie treści dokumentu XML 508
10.3 Weryfikacja XML 513
10.4 Wykrywanie zmian w dokumencie XML 519
10.5 Obsługa niedozwolonych znaków w łańcuchu XML 522
10.6 Przekształcanie XML 527
10.7 Weryfikacja zmodyfikowanych dokumentów XML bez ich ponownego wczytywania
10.8 Rozszerzanie przekształceń 541
10.9 Uzyskiwanie schematów na podstawie istniejących plików XML 548
10.10 Przekazywanie parametrów do przekształceń 550
11 Bezpieczeństwo
11.0 Wprowadzenie 557
11.1 Szyfrowanie i odszyfrowywanie łańcucha 557
11.2 Szyfrowanie i odszyfrowywanie pliku 562
11.3 Usuwanie informacji dotyczących szyfrowania 567
11.4 Zapobieganie uszkodzenia łańcucha podczas transferu danych 570
11.5 Gwarantowanie bezpieczeństwa asercji 578
11.6 Weryfikacja nadania określonych uprawnień podzespołowi 581
11.7 Minimalizowanie obszaru ataków na podzespół 582
11.8 Uzyskiwanie informacji na temat zabezpieczeń i inspekcji 583
11.9 Nadawanie lub odbieranie dostępu do pliku lub do klucza rejestru 589
11.10 Zabezpieczanie danych łańcuchowych 592
11.11 Zabezpieczanie danych strumieniowych 595
11.12 Szyfrowanie informacji w pliku web.config 609
11.13 Uzyskiwanie bezpieczniejszego dojścia do pliku 611
11.14 Przechowywanie haseł 613
12 Wątki, synchronizacja i współbieżność
12.0 Wprowadzenie 623
12.1 Tworzenie pól statycznych dla określonych wątków 624
12.2 Zapewnianie bezpiecznego wątkowo dostępu do elementów klasy 627
12.3 Zapobieganie dyskretnemu zakończeniu wątku 634
12.4 Powiadamianie o zakończeniu działania asynchronicznego delegata636
12.5 Przechowywanie prywatnych danych własnych wątku 639
12.6 Nadawanie dostępu do zasobów wielu klientom z wykorzystaniem semafora
12.7 Synchronizowanie wielu procesów za pomocą muteksu 649
12.8 Wykorzystywanie zdarzeń w celu zapewnienia współpracy wątków 659
12.9 Wykonywanie operacji niepodzielnych w wątkach 662
12.10 Optymalizacja dostępu polegającego głównie na odczycie danych 664
12.11 Jak sprawić, by nasze żądania do bazy danych były bardziej skalowalne 679
12.12 Uruchamianie zadań w określonej kolejności 682
13 Przybornik
13.0 Wprowadzenie 689
13.1 Obsługa zamykania systemu, zarządzania energią lub zmian w sesji użytkownika 689
13.2 Kontrola usługi 695
13.3 Pobieranie listy procesów, w których wczytany jest podzespół 700
13.4 Używanie kolejek komunikatów na lokalnej stacji roboczej 704
13.5 Przechwytywanie wyniku ze standardowego strumienia wyjścia 709
13.6 Przechwytywanie standardowego wyjścia procesu 711
13.7 Uruchamianie kodu we własnej domenie AppDomain714
13.8 Sprawdzanie wersji systemu operacyjnego i dodatku Service Pack