Description
C# 7.0 Kompletny przewodnik dla praktyków
C# jest jednym z lepiej dopracowanych języków programowania. Cechują go dojrzałość, prostota, nowoczesność i bezpieczeństwo. Został od podstaw zaprojektowany jako obiektowy. Stanowi integralną część platformy Microsoft .NET Framework. Jest ulubionym narzędziem profesjonalnych programistów, którym zależy na pisaniu kodu bezpiecznego, przejrzystego, wydajnego i prostego w konserwacji. W wersji 7.0 tego języka pojawiły się nowe usprawnienia, dzięki którym programowanie stało się jeszcze bardziej efektywne i satysfakcjonujące.Ta książka jest szóstym, zaktualizowanym i uzupełnionym wydaniem jednego z najlepszych podręczników programowania. Poza znakomitym kompendium języka C# znalazły się tu informacje o poszczególnych metodykach programowania, od sekwencyjnego aż po podstawy programowania deklaratywnego z wykorzystaniem atrybutów. Szczegółowo przedstawiono funkcje wprowadzone do wersji 7.0 języka, a także w platformie .NET Framework 4.7/.NET Core 2.0. Książka jest też wygodnym źródłem wiedzy o pewnych rzadko stosowanych konstrukcjach składniowych, specyficznych szczegółach i subtelnościach języka C#. Jasny i przejrzysty sposób prezentowania treści pozwoli na szybkie zrozumienie nawet najbardziej zawiłych zagadnień.W tej książce między innymi:przewodnik po C# oraz różne paradygmaty programowaniainterfejsy, dziedziczenie, typy bezpośrednieobsługa wyjątkówdelegaty, technologia LINQ i mechanizm refleksjizarządzanie wątkami i programowanie asynchroniczneC#. Nowoczesny, elegancki, bezpieczny! Spis treści: PrzedmowaWprowadzenieDla kogo przeznaczona jest ta książka?Cechy tej książkiWskazówki dotyczące pisania kodu w języku C#Przykładowy kodMapy myśliPomocne uwagiStruktura książkiPodziękowaniaO autorzeO redaktorze technicznym1. Wprowadzenie do języka C#Witaj, świecieTworzenie, edytowanie, kompilowanie i uruchamianie kodu źródłowego w języku C#Używanie narzędzia Dotnet CLIUżywanie środowiska Visual Studio 2017Tworzenie projektuKompilowanie i wykonywanie koduKod źródłowy do książki C# 7.0Używanie Dotnet CLIUżywanie Visual StudioPodstawy składni języka C#ZAGADNIENIE DLA POCZĄTKUJĄCYCHSłowa kluczoweSłowa kluczowe języka C#IdentyfikatoryZAGADNIENIE DLA ZAAWANSOWANYCHSłowa kluczoweDefinicja typuMetoda MainZAGADNIENIE DLA POCZĄTKUJĄCYCHCzym jest metodaZAGADNIENIE DLA ZAAWANSOWANYCHDeklaracja metody MainInstrukcje i ograniczniki instrukcjiZAGADNIENIE DLA ZAAWANSOWANYCHInstrukcje bez średnikówZAGADNIENIE DLA POCZĄTKUJĄCYCHCzym są odstępy?OdstępyZAGADNIENIE DLA POCZĄTKUJĄCYCHFormatowanie kodu za pomocą odstępówKorzystanie ze zmiennychZAGADNIENIE DLA POCZĄTKUJĄCYCHZmienne lokalneTypy danychZAGADNIENIE DLA POCZĄTKUJĄCYCHCzym jest typ danych?Deklarowanie zmiennejPrzypisywanie wartości do zmiennejKorzystanie ze zmiennejZAGADNIENIE DLA ZAAWANSOWANYCHWartość łańcuchów znaków jest niezmiennaDane wejściowe i wyjściowe w konsoliPobieranie danych wejściowych z konsoliZAGADNIENIE DLA ZAAWANSOWANYCHMetoda System.Console.Read()Wyświetlanie danych wyjściowych w konsoliKomentarzeZAGADNIENIE DLA POCZĄTKUJĄCYCHXMLWykonywanie kodu w środowisku zarządzanym i platforma CLIJęzyk CIL i narzędzie ILDASMZAGADNIENIE DLA ZAAWANSOWANYCHDane wyjściowe w języku CIL z programu HelloWorld.exeRóżne wersje platformy .NETInterfejsy APIWersje języka C# i platformy .NET.NET StandardPodsumowanie2. Typy danychPodstawowe typy liczboweTypy całkowitoliczboweTypy zmiennoprzecinkowe (float i double)Typ decimalZAGADNIENIE DLA ZAAWANSOWANYCHAnaliza typów zmiennoprzecinkowychLiterały liczboweZAGADNIENIE DLA POCZĄTKUJĄCYCHZachowaj ostrożność, gdy zapisujesz wartości na sztywnoZAGADNIENIE DLA POCZĄTKUJĄCYCHNotacja szesnastkowaZAGADNIENIE DLA ZAAWANSOWANYCHWyświetlanie liczb w formacie szesnastkowymZAGADNIENIE DLA ZAAWANSOWANYCHFormatowanie dwustronneInne podstawowe typyTyp logiczny (bool)Typ znakowy (char)ZAGADNIENIE DLA POCZĄTKUJĄCYCHStandard UnicodeZAGADNIENIE DLA ZAAWANSOWANYCH16 bitów nie wystarcza do przedstawienia wszystkich znaków UnicodeŁańcuchy znakówLiterałyInterpolacja łańcuchów znakówZAGADNIENIE DLA ZAAWANSOWANYCHWewnętrzne mechanizmy interpolacji łańcuchów znakówMetody dla typu stringZAGADNIENIE DLA ZAAWANSOWANYCHDyrektywy using i using staticFormatowanie łańcuchów znakówNowy wierszZAGADNIENIE DLA ZAAWANSOWANYCHWłaściwości w języku C#Długość łańcuchów znakówŁańcuchy znaków są niezmienneTyp System.Text.StringBuilderWartości null i voidSłowo kluczowe nullTyp voidKonwersje typów danychJawne rzutowanieZAGADNIENIE DLA ZAAWANSOWANYCHKonwersje kontrolowane i niekontrolowaneKonwersja niejawnaKonwersja typów bez rzutowaniaZAGADNIENIE DLA ZAAWANSOWANYCHMetoda TryParse()Podsumowanie3. Jeszcze o typach danychKategorie typówTypy bezpośrednieTypy referencyjneModyfikator umożliwiający stosowanie wartości nullZmienne lokalne z niejawnie określanym typem danychZAGADNIENIE DLA ZAAWANSOWANYCHTypy anonimoweKrotkiZAGADNIENIE DLA ZAAWANSOWANYCHTyp System.ValueTupleTabliceZAGADNIENIE DLA POCZĄTKUJĄCYCHTabliceDeklarowanie tablicyTworzenie instancji tablic i przypisywanie do nich wartościKorzystanie z tablicyDługośćInne metody dla tablicMetody instancyjne tablicyŁańcuchy znaków jako tabliceTypowe błędy związane z tablicamiPodsumowanieOperatory i przepływ sterowaniaOperatoryZAGADNIENIE DLA POCZĄTKUJĄCYCHOperatoryOperatory jednoargumentowe plus (+) i minus ()Arytmetyczne operatory dwuargumentowe (+, , *, /, %)ZAGADNIENIE DLA POCZĄTKUJĄCYCHNawiasy, łączność, priorytety i określanie wartościUżywanie operatora dodawania dla łańcuchów znakówUżywanie znaków w operacjach arytmetycznychWyjątkowe cechy typów zmiennoprzecinkowychZAGADNIENIE DLA ZAAWANSOWANYCHNieoczekiwane nierówności wartości typów zmiennoprzecinkowychZłożone operatory przypisania (+=, =, *=, /=, %=)Operatory inkrementacji i dekrementacji (++, )ZAGADNIENIE DLA POCZĄTKUJĄCYCHPrzykładowa dekrementacja w pętliZAGADNIENIE DLA ZAAWANSOWANYCHInkrementacja i dekrementacja bezpieczna ze względu na wątkiWyrażenia o stałej wartości i stałe lokalneZarządzanie przepływem sterowaniaInstrukcja ifZagnieżdżone instrukcje ifBloki kodu ({})Bloki kodu, zasięgi i przestrzenie deklaracjiWyrażenia logiczneOperatory relacyjne i równościOperatory logiczneOperator OR (||)Operator AND (&&)Operator XOR (^)Logiczny operator negacji (!)Operator warunkowy (?:)Operator ??Operator ?.ZAGADNIENIE DLA ZAAWANSOWANYCHStosowanie operatora ?. razem z delegatamiOperatory bitowe (<>, |, &, ^, ~)ZAGADNIENIE DLA POCZĄTKUJĄCYCHBity i bajtyOperatory przesunięcia (<>, <>=)Operatory bitowe (&, |, ^)ZAGADNIENIE DLA POCZĄTKUJĄCYCHObjaśnienie operatorów logicznychBitowe złożone operatory przypisania (&=, |=, ^=)Bitowy operator dopełnienia (~)Instrukcje związane z przepływem sterowania ciąg dalszyPętle while i do/whileZAGADNIENIE DLA POCZĄTKUJĄCYCHKiedy należy stosować pętlę while?Pętla forPętla foreachZAGADNIENIE DLA POCZĄTKUJĄCYCHW jakich sytuacjach sensowne jest stosowanie instrukcji switch?Podstawowa postać instrukcji switchInstrukcje skokuInstrukcja breakZAGADNIENIE DLA POCZĄTKUJĄCYCHSprawdzanie pozycji za pomocą operatorów bitowychInstrukcja continueInstrukcja gotoDyrektywy preprocesora języka C#Wykluczanie i dołączanie kodu (#if, #elif, #else, #endif)Definiowanie symboli preprocesora (#define, #undef)Generowanie błędów i ostrzeżeń (#error, #warning)Wyłączanie komunikatów z ostrzeżeniami (#pragma)Opcja nowarn:Określanie numerów wierszy (#line)Wskazówki dla edytorów kodu z interfejsem graficznym (#region, #endregion)Podsumowanie5. Metody i parametryWywoływanie metodyZAGADNIENIE DLA POCZĄTKUJĄCYCHCzym jest metoda?Przestrzenie nazwNazwa typuZasięgNazwa metodyParametry i argumentyWartości zwracane przez metodyInstrukcje a wywołania metodDeklarowanie metodyZAGADNIENIE DLA POCZĄTKUJĄCYCHRefaktoryzacja kodu przez umieszczanie go w metodachDeklarowanie parametrów formalnychDeklaracja typu wartości zwracanej przez metodęMetody z ciałem w postaci wyrażeniaZAGADNIENIE DLA POCZĄTKUJĄCYCHPrzestrzenie nazwDyrektywa usingZAGADNIENIE DLA ZAAWANSOWANYCHZagnieżdżone dyrektywy usingDyrektywa using staticTworzenie aliasówZwracane wartości i parametry metody Main()ZAGADNIENIE DLA ZAAWANSOWANYCHOdróżnianie od siebie różnych metod Main()ZAGADNIENIE DLA POCZĄTKUJĄCYCHStos wywołań i miejsce wywołaniaZaawansowane parametry metodParametry przekazywane przez wartośćZAGADNIENIE DLA POCZĄTKUJĄCYCHDopasowywanie zmiennych z jednostki wywołującej do nazw parametrówZAGADNIENIE DLA ZAAWANSOWANYCHTypy referencyjne a typy bezpośrednieParametry przekazywane przez referencję (z modyfikatorem ref)Parametry wyjściowe (z modyfikatorem out)Przekazywanie przez referencję w trybie tylko do odczytu (in)Zwracanie przez referencjęTablice parametrów (params)RekurencjaZAGADNIENIE DLA POCZĄTKUJĄCYCHBłąd nieskończonej rekurencjiPrzeciążanie metodParametry opcjonalneZAGADNIENIE DLA ZAAWANSOWANYCHOkreślanie wywoływanej metodyPodstawowa obsługa błędów z wykorzystaniem wyjątkówZAGADNIENIE DLA POCZĄTKUJĄCYCHWartość 42 jako łańcuch znaków i jako liczba całkowitaPrzechwytywanie błędówZAGADNIENIE DLA ZAAWANSOWANYCHDziedziczenie klas wyjątkówZAGADNIENIE DLA ZAAWANSOWANYCHOgólny blok catchZgłaszanie błędów za pomocą instrukcji throwUnikaj stosowania obsługi wyjątków do radzenia sobie z oczekiwanymi sytuacjamiZAGADNIENIE DLA ZAAWANSOWANYCHPrzekształcanie liczb za pomocą instrukcji TryParse()Podsumowanie6. KlasyZAGADNIENIE DLA POCZĄTKUJĄCYCHProgramowanie obiektoweHermetyzacjaDziedziczeniePolimorfizmDeklarowanie klasy i tworzenie jej instancjiZAGADNIENIE DLA POCZĄTKUJĄCYCHCzym są obiekty, a czym klasy?ZAGADNIENIE DLA POCZĄTKUJĄCYCHHermetyzacja, część 1. Obiekty łączą dane z metodamiPola instancjiDeklarowanie pola instancjiDostęp do pól instancjiMetody instancjiStosowanie słowa kluczowego thisZAGADNIENIE DLA POCZĄTKUJĄCYCHWykorzystywanie stylu programowania do unikania wieloznacznościZapisywanie i wczytywanie plikówModyfikatory dostępuZAGADNIENIE DLA POCZĄTKUJĄCYCHHermetyzacja, część 2. Ukrywanie informacjiWłaściwościDeklarowanie właściwościAutomatycznie implementowane wartościWskazówki dotyczące właściwości i pólUżywanie właściwości ze sprawdzaniem poprawnościZAGADNIENIE DLA ZAAWANSOWANYCHOperator nameofWłaściwości przeznaczone tylko do odczytu i tylko do zapisuWłaściwości jako pola wirtualneModyfikatory dostępu w getterach i setterachWłaściwości i wywołania metod nie są dozwolone jako wartości parametrów ref i outZAGADNIENIE DLA ZAAWANSOWANYCHWewnętrzne mechanizmy właściwościKonstruktoryDeklarowanie konstruktoraZAGADNIENIE DLA ZAAWANSOWANYCHSzczegóły implementacji operatora newKonstruktory domyślneInicjatory obiektówZAGADNIENIE DLA ZAAWANSOWANYCHInicjatory kolekcjiZAGADNIENIE DLA ZAAWANSOWANYCHFinalizatoryPrzeciążanie konstruktorówŁączenie konstruktorów w łańcuch wywoływanie innego konstruktora za pomocą słowa kluczowego thisZAGADNIENIE DLA POCZĄTKUJĄCYCHCentralizowanie inicjowaniaDekonstruktorySkładowe statycznePola statyczneZAGADNIENIE DLA POCZĄTKUJĄCYCHDane można powiązać zarówno z klasą, jak i z obiektamiMetody statyczneKonstruktory statyczneZAGADNIENIE DLA ZAAWANSOWANYCHPreferuj statyczną inicjację w deklaracjiWłaściwości statyczneKlasy statyczneMetody rozszerzająceHermetyzacja danychModyfikator constZAGADNIENIE DLA ZAAWANSOWANYCHStałe publiczne powinny być niezmiennymi wartościamiModyfikator readonlyKlasy zagnieżdżoneKlasy częścioweDefiniowanie klasy częściowejMetody częściowePodsumowanieDziedziczenieZAGADNIENIE DLA POCZĄTKUJĄCYCHDefinicje z obszaru dziedziczeniaTworzenie klas pochodnychRzutowanie między typami bazowymi i pochodnymiZAGADNIENIE DLA POCZĄTKUJĄCYCHRzutowanie w łańcuchu dziedziczeniaZAGADNIENIE DLA ZAAWANSOWANYCHDefiniowanie niestandardowych konwersjiModyfikator dostępu privateModyfikator dostępu protectedMetody rozszerzająceDziedziczenie po jednym typieKlasy zamkniętePrzesłanianie składowych z klas bazowychModyfikator virtualModyfikator newModyfikator sealedSkładowa baseKonstruktoryKlasy abstrakcyjneZAGADNIENIE DLA POCZĄTKUJĄCYCHKlasy abstrakcyjneZAGADNIENIE DLA POCZĄTKUJĄCYCHPolimorfizmWszystkie klasy są pochodne od System.ObjectSprawdzanie typu za pomocą operatora isDopasowanie do wzorca z użyciem operatora isDopasowanie do wzorca w instrukcji switchKonwersja z wykorzystaniem operatora asPodsumowanie8. InterfejsyWprowadzenie do interfejsówZAGADNIENIE DLA POCZĄTKUJĄCYCHPo co stosować interfejsy?Polimorfizm oparty na interfejsachImplementacja interfejsuSkładowe z jawnie podawanym interfejsemSkładowe bez jawnie podawanego interfejsuPorównanie implementacji z jawnie podawanym interfejsem i bez podawania interfejsuPrzekształcanie między klasą z implementacją i interfejsamiDziedziczenie interfejsówDziedziczenie po wielu interfejsachMetody rozszerzające i interfejsyImplementowanie wielodziedziczenia za pomocą interfejsówZAGADNIENIE DLA POCZĄTKUJĄCYCHDiagramy interfejsówZarządzanie wersjamiInterfejsy a klasyInterfejsy a atrybutyPodsumowanie9. Typy bezpośrednieZAGADNIENIE DLA POCZĄTKUJĄCYCHKategorie typówTypy bezpośrednieTypy referencyjneStrukturyInicjowanie strukturZAGADNIENIE DLA ZAAWANSOWANYCHUżywanie operatora new do typów bezpośrednichUżywanie operatora defaultDziedziczenie i interfejsy a typy bezpośrednieOpakowywanieZAGADNIENIE DLA ZAAWANSOWANYCHTypy bezpośrednie w instrukcji lockZAGADNIENIE DLA ZAAWANSOWANYCHJak uniknąć opakowywania w wywołaniach metod?WyliczeniaZgodność typów wyliczeniowychKonwersja między wyliczeniami a łańcuchami znakówWyliczenia jako flagiZAGADNIENIE DLA ZAAWANSOWANYCHAtrybut FlagsAttributePodsumowanie10. Dobrze uformowane typyPrzesłanianie składowych z klasy objectPrzesłanianie metody ToString()Przesłanianie metody GetHashCode()Przesłanianie metody Equals()Tożsamość obiektów a równe wartości obiektówImplementowanie metody Equals()Przeciążanie funkcji GetHashCode() i Equals() z użyciem krotekPrzeciążanie operatorówOperatory porównania (==, !=, , =)Operatory dwuargumentowe (+, , *, /, %, &, |, ^, <>)Łączenie przypisania z operatorami dwuargumentowymi (+=, =, *=, /=, %=, &=, )Logiczne operatory warunkowe (&&, ||)Operatory jednoargumentowe (+, , !, ~, ++, , true, false)Operatory konwersjiZAGADNIENIE DLA ZAAWANSOWANYCHOperator rzutowania ()Wytyczne dotyczące operatorów konwersjiWskazywanie innych podzespołówZAGADNIENIE DLA POCZĄTKUJĄCYCHBiblioteki klasWskazywanie bibliotekiWskazywanie projektu lub biblioteki w Dotnet CLIWskazywanie projektu lub biblioteki w Visual Studio 2017Pakiety NuGetReferencje do pakietów NuGet w Dotnet CLIDodawanie referencji do pakietów NuGet w Visual Studio 2017Wywoływanie pakietu NuGetZAGADNIENIE DLA ZAAWANSOWANYCHHermetyzacja typówModyfikatory dostępu public i internal w deklaracjach typówModyfikator protected internal dla składowych w typachZAGADNIENIE DLA POCZĄTKUJĄCYCHModyfikatory dostępu dla składowych w typachDefiniowanie przestrzeni nazwKomentarze XML-oweWiązanie komentarzy XML-owych z konstrukcjami programistycznymiGenerowanie pliku z dokumentacją w formacie XMLOdzyskiwanie pamięciZAGADNIENIE DLA ZAAWANSOWANYCHOdzyskiwanie pamięci w platformie .NETSłabe referencjePorządkowanie zasobówFinalizatoryDeterministyczna finalizacja z wykorzystaniem instrukcji usingOdzyskiwanie pamięci, finalizacja i interfejs IDisposableZAGADNIENIE DLA ZAAWANSOWANYCHPrzekazywanie wyjątków z konstruktorówZAGADNIENIE DLA ZAAWANSOWANYCHPonowne tworzenie usuwanych obiektówLeniwe inicjowanieZAGADNIENIE DLA ZAAWANSOWANYCHLeniwe inicjowanie za pomocą typów generycznych i wyrażeń lambdaPodsumowanie11. Obsługa wyjątkówWiele typów wyjątkówPrzechwytywanie wyjątkówPonowne zgłaszanie przetwarzanego wyjątkuZAGADNIENIE DLA ZAAWANSOWANYCHZgłaszanie istniejącego już wyjątku bez zastępowania informacji na stosieOgólny blok catchZAGADNIENIE DLA ZAAWANSOWANYCHOgólne bloki catch w języku C# 1.0ZAGADNIENIE DLA ZAAWANSOWANYCHWewnętrzne mechanizmy pustego bloku catchWskazówki związane z obsługą wyjątkówDefiniowanie niestandardowych wyjątkówZAGADNIENIE DLA ZAAWANSOWANYCHWyjątki z obsługą serializacjiPonowne zgłaszanie opakowanego wyjątkuZAGADNIENIE DLA POCZĄTKUJĄCYCHKonwersje z kontrolą i bez kontroliPodsumowanie12. Typy generyczneJęzyk C# bez typów generycznychZAGADNIENIE DLA POCZĄTKUJĄCYCHInny przykład typy bezpośrednie z możliwą wartością nullWprowadzenie do typów generycznychUżywanie klasy generycznejDefiniowanie prostej klasy generycznejZalety typów generycznychWskazówki związane z tworzeniem nazw parametrów określających typyGeneryczne interfejsy i strukturyZAGADNIENIE DLA ZAAWANSOWANYCHWielokrotne implementowanie jednego interfe
su w tej samej klasieDefiniowanie konstruktora i finalizatoraOkreślanie wartości domyślnejWiele parametrów określających typZAGADNIENIE DLA POCZĄTKUJĄCYCHKrotki typy o różnej arnościZagnieżdżone typy generyczneOgraniczeniaOgraniczenia dotyczące interfejsuOgraniczenia dotyczące klasyOgraniczenia wymagające struktury lub klasy (struct i class)Zestawy ograniczeńOgraniczenia dotyczące konstruktoraOgraniczenia dotyczące dziedziczeniaZAGADNIENIE DLA ZAAWANSOWANYCHWymogi związane z ograniczeniamiOgraniczenia dotyczące operatorów są niedozwoloneRelacja LUB między ograniczeniami nie jest obsługiwanaOgraniczenia dotyczące delegatów i wyliczeń są niedozwoloneW ograniczeniu dotyczącym konstruktora można podawać tylko konstruktory domyślneMetody generyczneInferencja typów w metodach generycznychDodawanie ograniczeńZAGADNIENIE DLA ZAAWANSOWANYCHRzutowanie w metodach generycznychKowariancja i kontrawariancjaUmożliwianie kowariancji za pomocą modyfikatora out stosowanego do parametru określającego typ (od wersji C# 4.0)Umożliwianie kontrawariancji z użyciem modyfikatora in dla parametru określającego typ (od wersji C# 4.0)Obsługa niezabezpieczonej kowariancji w tablicachWewnętrzne mechanizmy typów generycznychZAGADNIENIE DLA ZAAWANSOWANYCHReprezentacja typów generycznych w kodzie CILZAGADNIENIE DLA ZAAWANSOWANYCHTworzenie obiektów typów generycznych opartych na typach bezpośrednichZAGADNIENIE DLA ZAAWANSOWANYCHTworzenie obiektów typów generycznych opartych na typach referencyjnychPodsumowanie13. Delegaty i wyrażenia lambdaWprowadzenie do delegatówOpis scenariuszaTyp danych w postaci delegataDeklarowanie typu delegataTypy delegatów do ogólnego użytku System.Func i System.ActionZAGADNIENIE DLA ZAAWANSOWANYCHDeklarowanie typu delegataTworzenie instancji delegataZAGADNIENIE DLA ZAAWANSOWANYCHTworzenie instancji delegatów w wersji C# 1.0ZAGADNIENIE DLA ZAAWANSOWANYCHWewnętrzne mechanizmy delegatówWyrażenia lambdaLambdy w postaci instrukcjiLambdy w postaci wyrażeńMetody anonimoweZAGADNIENIE DLA ZAAWANSOWANYCHBezparametrowe metody anonimoweZAGADNIENIE DLA ZAAWANSOWANYCHSkąd się wzięła nazwa lambda?Delegaty nie zapewniają równości strukturalnejZAGADNIENIE DLA ZAAWANSOWANYCHWewnętrzne mechanizmy wyrażeń lambda i metod anonimowychZmienne zewnętrzneZAGADNIENIE DLA ZAAWANSOWANYCHImplementacja zmiennych zewnętrznych w kodzie CILZAGADNIENIE DLA ZAAWANSOWANYCHPrzypadkowe przechwytywanie zmiennych z pętliDrzewo wyrażeńUżywanie wyrażeń lambda jako danychDrzewa wyrażeń są grafami obiektówDelegaty a drzewa wyrażeńBadanie drzewa wyrażeńPodsumowanie14. ZdarzeniaImplementacja wzorca publikuj-subskrybuj za pomocą delegatów typu multicastDefiniowanie metod subskrybującychDefiniowanie klasy publikującej zdarzeniaŁączenie subskrybentów z nadawcąWywoływanie delegataSprawdzanie, czy wartość jest różna od nullZAGADNIENIE DLA ZAAWANSOWANYCHOperator = delegatów zwraca nową instancjęZAGADNIENIE DLA ZAAWANSOWANYCHWywoływanie delegata z zachowaniem bezpieczeństwa ze względu na wątkiOperatory używane do delegatówWywołania sekwencyjneZAGADNIENIE DLA ZAAWANSOWANYCHWewnętrzne mechanizmy delegatów typu multicastObsługa błędówWartości zwracane przez metodę i przekazywanie danych przez referencjęZdarzeniaPo co stosować zdarzenia?Hermetyzacja subskrypcjiHermetyzacja procesu publikacjiDeklarowanie zdarzeńKonwencje programistyczneTypy generyczne a delegatyZAGADNIENIE DLA ZAAWANSOWANYCHWewnętrzne mechanizmy zdarzeńModyfikowanie implementacji zdarzeńPodsumowanie15. Interfejsy kolekcji ze standardowymi operatorami kwerendInicjatory kolekcjiInterfejs IEnumerable sprawia, że klasa staje się kolekcjąInstrukcja foreach dla tablicInstrukcja foreach dla interfejsu IEnumerableWspółdzielony stanZAGADNIENIE DLA ZAAWANSOWANYCHPorządkowanie zasobów po iteracjiZAGADNIENIE DLA ZAAWANSOWANYCHPętla foreach bez interfejsu IEnumerableNie modyfikuj kolekcji w trakcie iterowania z wykorzystaniem pętli foreachStandardowe operatory kwerendFiltrowanie danych za pomocą metody Where()Projekcje z wykorzystaniem metody Select()ZAGADNIENIE DLA ZAAWANSOWANYCHRównoległe wykonywanie kwerend w technologii LINQZliczanie elementów za pomocą metody Count()Opóźnione wykonanieSortowanie z wykorzystaniem metod OrderBy() i ThenBy()ZAGADNIENIE DLA POCZĄTKUJĄCYCHZłączaniePrzeprowadzanie złączania wewnętrznego za pomocą instrukcji Join()Grupowanie wyników za pomocą metody GroupBy()Implementowanie relacji jeden do wielu za pomocą metody GroupJoin()ZAGADNIENIE DLA ZAAWANSOWANYCHImplementowanie złączeń zewnętrznych za pomocą metody GroupJoin()Wywoływanie metody SelectMany()Inne standardowe operatory kwerendZAGADNIENIE DLA ZAAWANSOWANYCHKlasa Queryable z metodami rozszerzającymi interfejs IQueryableTypy anonimowe w technologii LINQTypy anonimoweZAGADNIENIE DLA POCZĄTKUJĄCYCHZmienne lokalne o niejawnie określanym typie (zmienne var)Pobieranie danych do zmiennych typu anonimowego za pomocą technologii LINQWięcej o typach anonimowych i zmiennych lokalnych o niejawnie określanym typieZAGADNIENIE DLA ZAAWANSOWANYCHGenerowanie typów anonimowychZAGADNIENIE DLA ZAAWANSOWANYCHInicjatory kolekcji a typy anonimowePodsumowanie16. Technologia LINQ i wyrażenia z kwerendamiWprowadzenie do wyrażeń z kwerendamiProjekcjaZAGADNIENIE DLA POCZĄTKUJĄCYCHOpóźnione wykonywanie wyrażeń z kwerendąZAGADNIENIE DLA ZAAWANSOWANYCHImplementacja opóźnionego wykonywaniaFiltrowanieSortowanieKlauzula letGrupowanieKontynuowanie kwerendy za pomocą klauzuli intoSpłaszczanie sekwencji składających się z sekwencji za pomocą kilku klauzul fromZAGADNIENIE DLA POCZĄTKUJĄCYCHNiepowtarzalne elementyWyrażenia z kwerendą to tylko wywołania metodPodsumowanie17. Tworzenie niestandardowych kolekcjiInne interfejsy implementowane w kolekcjachPorównanie interfejsów IList i IDictionaryInterfejs ICollectionPodstawowe klasy kolekcjiKolekcje w postaci list ListZAGADNIENIE DLA ZAAWANSOWANYCHModyfikowanie procesu sortowania kolekcjiPorządkowanie całkowitePrzeszukiwanie kolekcji typu ListZAGADNIENIE DLA ZAAWANSOWANYCHWyszukiwanie wielu elementów za pomocą metody FindAll()Kolekcje w postaci słownika DictionaryZAGADNIENIE DLA ZAAWANSOWANYCHModyfikowanie sprawdzania równości w słownikuZAGADNIENIE DLA POCZĄTKUJĄCYCHWymogi związane ze sprawdzaniem równościKolekcje posortowane SortedDictionary i SortedListKolekcje w postaci stosu StackKolekcje w postaci kolejek QueueListy powiązane LinkedListUdostępnianie indekseraZAGADNIENIE DLA ZAAWANSOWANYCHOkreślanie nazwy indeksera za pomocą atrybutu IndexerNameZAGADNIENIE DLA ZAAWANSOWANYCHDefiniowanie operatora indeksowania przyjmującego różną liczbę parametrówZwracanie wartości null lub pustej kolekcjiIteratoryZAGADNIENIE DLA ZAAWANSOWANYCHPoczątki iteratorówDefiniowanie iteratoraSkładnia iteratoraZwracanie wartości przez iteratorIteratory i stanInne przykładowe iteratoryUmieszczanie instrukcji yield return w pętliZAGADNIENIE DLA ZAAWANSOWANYCHZagrożenia związane z iteratorami rekurencyjnymiZAGADNIENIE DLA POCZĄTKUJĄCYCHStruktury a klasyAnulowanie dalszych iteracji za pomocą instrukcji yield breakZAGADNIENIE DLA ZAAWANSOWANYCHJak działają iteratoryZAGADNIENIE DLA ZAAWANSOWANYCHKontekstowe słowa kluczoweTworzenie wielu identyfikatorów w jednej klasieWymagania związane z instrukcją yieldPodsumowanie18. Refleksja, atrybuty i programowanie dynamiczneMechanizm refleksjiDostęp do metadanych za pomocą obiektu typu System.TypeMetoda GetType()Operator typeof()Wywoływanie składowychRefleksja dotycząca typów generycznychUstalanie typów podanych w parametrach określających typOkreślanie, czy klasa lub metoda ma parametry generycznePobieranie parametrów określających typ z klas lub metod generycznychOperator nameofAtrybutyNiestandardowe atrybutyWyszukiwanie atrybutówInicjowanie atrybutu za pomocą konstruktoraAtrybut System.AttributeUsageAttributeParametry nazwaneZAGADNIENIE DLA POCZĄTKUJĄCYCHAtrybut FlagsAttributePredefiniowane atrybutyAtrybut System.ConditionalAttributeAtrybut System.ObsoleteAttributeAtrybuty związane z serializacjąAtrybut System.NonSerializableUdostępnianie niestandardowej serializacjiZarządzanie wersjami w trakcie serializacjiZAGADNIENIE DLA ZAAWANSOWANYCHAtrybut System.SerializableAttribute i kod CILProgramowanie z wykorzystaniem obiektów dynamicznychKorzystanie z refleksji za pomocą instrukcji dynamicZasady i operacje związane z typem dynamicZAGADNIENIE DLA ZAAWANSOWANYCHOmówienie typu dynamicPo co stosować wiązanie dynamiczne?Statyczna kompilacja a programowanie dynamiczneTworzenie niestandardowych obiektów dynamicznychPodsumowanie19. WielowątkowośćPodstawy wielowątkowościZAGADNIENIE DLA POCZĄTKUJĄCYCHSłownictwo związane z wielowątkowościąZAGADNIENIE DLA POCZĄTKUJĄCYCHCo, jak i dlaczego w dziedzinie wielowątkowościZAGADNIENIE DLA POCZĄTKUJĄCYCHUwagi dotyczące wydajnościZAGADNIENIE DLA POCZĄTKUJĄCYCHProblemy z wątkamiWiększość operacji nie jest atomowaNiepewność spowodowana sytuacją wyściguModele zarządzania pamięcią są skomplikowaneBlokady mogą skutkować zakleszczeniemUżywanie klasy System.ThreadingWykonywanie operacji asynchronicznych za pomocą klasy System.Threading.ThreadZarządzanie wątkamiNie usypiaj wątków w kodzie produkcyjnymNie usuwaj wątków w kodzie produkcyjnymPule wątkówZadania asynchroniczneOd wątków do zadańWprowadzenie do asynchronicznych zadańKontynuacja zadaniaUżywanie wyjątków AggregateException do obsługi nieobsłużonych wyjątków w zadaniachZAGADNIENIE DLA ZAAWANSOWANYCHRadzenie sobie z nieobsłużonymi wyjątkami w wątkuAnulowanie zadaniaTask.Run() skrócona i uproszczona wersja wywołania Task.Factory.StartNew()Długotrwałe zadaniaZadania pozwalają zwalniać zasobyWzorzec obsługi asynchroniczności za pomocą zadańSynchroniczne wywoływanie operacji o dużej latencjiAsynchroniczne wywoływanie operacji o dużej latencji za pomocą biblioteki TPLAsynchroniczność oparta na zadaniach oraz instrukcjach async i awaitZwracanie wartości w metodach asynchronicznychDodanie możliwości zwracania typu ValueTask w metodach asynchronicznychZwracanie wartości void w metodach asynchronicznychAsynchroniczne lambdy i funkcje lokalneZAGADNIENIE DLA ZAAWANSOWANYCHTworzenie niestandardowej metody asynchronicznejZAGADNIENIE DLA ZAAWANSOWANYCHOczekiwanie na wartości inne niż obiekt typu TaskProgramy szeregujące zadania i kontekst synchronizacjiModyfikatory async i await w programach z interfejsem użytkownika z systemu WindowsOperatory awaitRównoległe wykonywanie iteracji pętliZAGADNIENIE DLA ZAAWANSOWANYCHW jaki sposób biblioteka TPL dostraja wydajnośćZAGADNIENIE DLA POCZĄTKUJĄCYCHUżywanie typu AggregateException do obsługi wyjątków w pętlach równoległychAnulowanie wykonywania pętli równoległejZAGADNIENIE DLA ZAAWANSOWANYCHOpcje pętli równoległychZAGADNIENIE DLA ZAAWANSOWANYCHWychodzenie z pętli równoległejRównoległe wykonywanie kwerend LINQAnulowanie kwerendy PLINQPodsumowanie20. Synchronizowanie wątkówPo co stosować synchronizację?ZAGADNIENIE DLA POCZĄTKUJĄCYCHWiele wątków i zmienne lokalneSynchronizacja z wykorzystaniem klasy MonitorStosowanie słowa kluczowego lockZAGADNIENIE DLA POCZĄTKUJĄCYCHZwracanie obiektu typu Task bez operatora awaitWybieranie obiektu reprezentującego blokadęDlaczego należy unikać blokad opartych na słowie kluczowym this, wyrażeniu typeof(typ) lub typie string?ZAGADNIENIE DLA ZAAWANSOWANYCHUnikaj synchronizacji z wykorzystaniem atrybutu MethodImplAttributeDeklarowanie pól jako zmiennych (volatile)Stosowanie klasy System.Threading.InterlockedPowiadomienia o zdarzeniach kierowane do wielu wątkówNajlepsze praktyki z obszaru projektowania synchronizacjiUnikanie zakleszczeniaKiedy należy zapewniać synchronizację?Unikanie zbędnych blokadInne typy związane z synchronizacjąKorzystanie z klasy System.Threading.MutexKlasa WaitHandleZdarzenia resetujące ManualResetEvent i ManualResetEventSlimZAGADNIENIE DLA ZAAWANSOWANYCHPrzedkładaj typ ManualResetEvent i semafory nad typ AutoResetEventTypy Semaphore, SemaphoreSlim i CountdownEventKlasy kolekcji przetwarzanych równoleglePamięć lokalna wątkówThreadLocalPamięć lokalna wątku tworzona za pomocą atrybutu ThreadStaticAttributeZegaryZAGADNIENIE DLA ZAAWANSOWANYCHKontrolowanie modelu wątkowego w technologii COM za pomocą atrybutu STAThreadAttributePodsumowanie21. Współdziałanie między platformami i niezabezpieczony kodMechanizm P/InvokeDeklarowanie funkcji zewnętrznychTypy danych parametrówStosowanie parametrów ref zamiast wskaźnikówUżywanie atrybutu StructLayoutAttribute do zapewniania układu sekwencyjnegoObsługa błędówUżywanie typu SafeHandleWywoływanie funkcji zewnętrznychUpraszczanie wywołań interfejsów API za pomocą nakładekOdwzorowywanie wskaźników do funkcji na delegatyWskazówkiWskaźniki i adresyKod niezabezpieczonyDeklarowanie wskaźnikówPrzypisywanie wartości do wskaźnikówZapewnianie stałej lokalizacji danychAlokowanie danych na stosieDereferencja wskaźnikówDostęp do składowych typu docelowegoWykonywanie niezabezpieczonego kodu za pomocą delegataPodsumowanie22. Standard CLIDefiniowanie standardu CLIImplementacje standardu CLIMicrosoft .NET Framework.NET CoreXamarinSpecyfikacja .NET StandardBiblioteka BCLKompilacja kodu w języku C# na kod maszynowyŚrodowisko uruchomienioweOdzyskiwanie pamięciOdzyskiwanie pamięci w platformie .NETBezpieczeństwo ze względu na typZAGADNIENIE DLA ZAAWANSOWANYCHOmijanie hermetyzacji i modyfikatorów dostępuPrzenośność między platformamiWydajnośćPodzespoły, manifesty i modułyJęzyk Common Intermediate LanguageCommon Type SystemCommon Language SpecificationMetadaneArchitektura .NET Native i kompilacja AOTPodsumowanie O autorze: Mark Michaelis jest autorytetem w dziedzinie tworzenia zaawansowanego oprogramowania. Zabiera głos na prestiżowych konferencjach dla programistów. Obecnie prowadzi kolumnę Essential .NET w „MSDN Magazine”. Od 1996 roku posiada tytuł Microsoft MVP. W 2007 roku został dyrektorem regionalnym Microsoftu, jest też członkiem kilku zespołów oceniających projekty oprogramowania tej firmy (między innymi języka C# i technologii VSTS).
: Podręczniki szkolne
działyńskich poznań, barbara załugowicz, grzybno pomorskie, plan zajęć agh eaiib
yyyyy