JĘZYK C# 2010
I PLATFORMA .NET 4.0

Autor

Andrew Troelsen

WYDAWNICTWO NAUKOWE PWN

WARSZAWA 2013

Polska wersja okładki
Przemysław Spiechowski

Redaktor inicjujący
Kinga Tomaszewska

Redaktor
Joanna Cierkońska

Korektor
Ewa Zdanowicz

EPUB został przygotowany na podstawie wydania papierowego z 2010 r.
(wyd. I)

Authorized translation from the English language edition, entitled:

Pro C# 2010 ant the .NET 4 Platform, Fifth Edition, ISBN 978-1-4302-2549-2

Original edition Copyright © 2010 by Andrew Troelsen All rights reserved

Copyright © for the Polish edition by Wydawnictwo Naukowe PWN SA

Warszawa 2011

ISBN 978-83-01-17538-2

Wydawnictwo Naukowe PWN SA

02-460 Warszawa, ul. Gottlieba Daimlera 2

tel. 22 69 54 321, faks 22 69 54 288

e-mail: pwn@pwn.com.pl; www.pwn.pl

Skład komputerowy: Poligrafia Komputerowa i Programowanie

Krzysztof Świstak

Skład wersji elektronicznej:

Virtualo Sp. z o.o.

Pamięci mojej wspaniałej babci Maxine.

Kocham cię, Gerto. Spoczywaj w pokoju.

O autorze

Andrew Troelsen z czułością wspomina swój pierwszy komputer Atari 400, wyposażony w kasetową pamięć oraz czarno-biały telewizor pełniący funkcję monitora (i dziękuje rodzicom, że pozwolili mu go trzymać w sypialni!). Jest również wdzięczny za nieukazujący się już magazyn „Compute!”, licencjat z lingwistyki matematycznej oraz trzy lata nauki formalnego sanskrytu – wszystko to miało przemożny wpływ na jego obecną karierę.

Andrew pracuje obecnie w firmie Intertech (www.intertech.com), centrum szkoleniowym i konsultingowym zajmującym się .NET i Javą.

Jest również autorem wielu książek, w tym: Developer’s Workshop to COM and ATL 3.0 (Wordware Publishing, 2000), COM and .NET Interoperability (Apress, 2002) oraz Visual Basic 2008 and the .NET 3.5 Platform: An Advanced Guide (Apress, 2008).

O redaktorze technicznym

Andy Olsen to niezależny konsultant i szkoleniowiec działający w Wielkiej Brytanii. Platforma .NET jest mu znana od czasu pierwszego wydania beta, brał też aktywny udział w powstawaniu najnowszych elementów wersji 4.0. Mieszka nad morzem ze swą żoną Jayne oraz dziećmi, Emily i Tomem. Uwielbia biegać brzegiem morza (z regularnymi przystankami na filiżankę kawy), jeździć na nartach, a także uganiać się za łabędziami i rybołowami. Można do niego pisać na adres andyo@olsensoft.com.

Podziękowania

Z jakiegoś zwariowanego powodu (albo i wielu powodów) przygotowanie niniejszego wydania tego tekstu okazało się znacznie trudniejsze, niż przewidywałem. Gdyby nie pomoc i wsparcie bardzo wielu osób, podejrzewam, że książka Język C# 2010 i platforma .NET 4.0 ukazałaby się mniej więcej w tym samym czasie, co .NET 6.0 beta 1.

Ogromne podziękowania należą się mojemu redaktorowi technicznemu Andy Olsenowi. Jego udział nie ograniczył się do wypunktowania źle postawionych średników. Jego liczne trafne sugestie pozwoliły mi udoskonalić i zwiększyć przejrzystość przykładowych listingów. Dziękuję, Andy!

Kolejne ogromne podziękowania należą się zespołowi korektorów. Mary Behr, Patrick Meader, Katie Stence i Sharon Terdeman to nie tylko sympatyczni współpracownicy: udało im się zidentyfikować i poprawić błędy gramatyczne, których z pewnością sam bym nie zauważył.

Specjalne podziękowania przesyłam Debrze Kelly z wydawnictwa Apress. To nasz pierwszy wspólny projekt i mimo częstego przekraczania terminów, gubienia e-maili i aktualizacji do aktualizacji, mam szczerą nadzieję, że będzie chciała jeszcze ze mną pracować. Dziękuję, Debro.

Na końcu jak najbardziej zasłużone podziękowania przeznaczam dla mojej żony Mandy. Jak zawsze zadbała o to, abym przygody z pisaniem nie przypłacił utratą zmysłów. Dziękuję, skarbie.

Wprowadzenie

Książka ta istnieje – pod taką czy inną postacią, ale podobnym tytułem – mniej więcej od lata 2001, kiedy to Microsoft podarował światu platformę .NET wersji 1.0 beta 2. Od tego momentu z radością obserwuję bardzo dobry prasowy odbiór mojego tekstu: przez ten czas zostałem finalistą Jolt Award w 2002 (przegrałem, ale życie toczy się dalej), a rok później otrzymałem nagrodę Referenceware Excellence za najlepszą książkę o programowaniu.

Co ważniejsze, z radością otrzymuję e-maile od czytelników z całego świata. Bardzo fajnie jest pogawędzić z tyloma ludźmi, którzy mówią, że moja książka w jakimś drobnym stopniu ułatwiła im rozwój zawodowy. Przy okazji muszę wspomnieć, że jest lepsza niż kiedykolwiek wcześniej, a to dzięki czytelnikom, którzy zasugerowali różne poprawki, znaleźli literówki w tekście i zwrócili moją uwagę na inne niedociągnięcia.

Poza tym z zaskoczeniem dowiedziałem się, że ta właśnie książka była i jest wykorzystywana w szkołach pogimnazjalnych i na uniwersytetach, a także na wielu kursach z informatyki na różnym poziomie zaawansowania.

Prasie, czytelnikom i wykładowcom mogę jedynie powiedzieć: dziękuję i życzę wesołego programowania!

W każdym razie od czasu pierwszego wydania nie ustaję w wysiłkach, aby dostosowywać aktualność materiału do każdego kolejnej edycji .NET. Piąte wydanie, które Czytelnik ma teraz przed oczyma, zostało wzbogacone omówieniem nowych elementów języka programowania C# 2010, jak również samej platformy .NET 4.0. Zawiera informacje na temat DLR (Dynamic Language Runtime), TPL (Task Parallel Library), PLINQ (Parallel LINQ) i EF (ADO.NET Entity Framework) oraz kilka „drobniejszych” (ale bardzo przydatnych) aktualizacji, na przykład argumenty imienne C# 2010, parametry opcjonalne C# 2010 czy klasa Lazy<T>.

Oprócz tych wszystkich nowości książka nadal zawiera niezmienne podstawy samego języka C#, a także omówienie: filarów programowania obiektowego, konfiguracji pakietów, dostępu do baz danych (za pośrednictwem ADO.NET), a także tworzenia aplikacji graficznych, sieciowych oraz systemów rozproszonych, jak również wiele innych informacji.

Tak jak w poprzednich wydaniach, również w tym omawiam język programowania C# oraz biblioteki klas bazowych .NET prosto i przystępnie (przynajmniej takie opinie do mnie docierają). Również w tym wydaniu skoncentrowałem się na przedstawieniu informacji potrzebnych do tworzenia współczesnych rozwiązań, aby nie poświęcać zbyt wiele miejsca na osobliwe szczegóły, którymi naprawdę mało kto się przejmuje.

Tworzymy zespół

Autorzy książek technicznych piszą dla wymagającej grupy odbiorców (wiem o tym dobrze, bo sam do niej należę). Zdajemy sobie sprawę, że pisanie programów na dowolnej platformie (np. .NET, Java albo COM) jest niezwykle skomplikowane i ściśle związane z wymaganiami danego działu, firmy, bazy klientów i tematyki. Można pracować w wydawnictwie publikacji elektronicznych, tworzyć systemy dla władz krajowych albo lokalnych, działać dla NASA albo jakiegoś wojska. Jeśli chodzi o mnie, zajmowałem się pisaniem programów edukacyjnych dla dzieci (ktoś może kojarzy Oregon Trail/Amazon Trail?), różnych systemów n-warstwowych oraz projektami w branżach medycznej i finansowej. Jeśli jakimś trafem w przeszłości nie pracowaliśmy razem, to z prawdopodobieństwem bliskim 100% mogę założyć, że kod pisany przez Czytelnika w jego miejscu pracy ma bardzo niewiele wspólnego z kodem pisanym przeze mnie.

Dlatego też celowo unikałem przykładów, które wiązałyby przykładowy kod z konkretną branżą albo odmianą programowania. Z tego powodu omawiam język C#, programowanie obiektowe, CLR oraz biblioteki klas bazowych .NET 4.0 na przykładach kompletnie oderwanych od konkretnej branży. Zamiast wypełniać tabele danymi, obliczać wyciągi z listy płac czy coś w tym stylu, postawiłem na tematykę, z którą prawie każdy ma do czynienia: samochody (plus kilka struktur geometrycznych oraz systemów list płac pracowniczych). I tutaj wkracza Czytelnik.

Moim zadaniem jest wyjaśnienie języka programowania C# oraz podstawowych aspektów platformy .NET najlepiej, jak potrafię. Zrobię również wszystko, co w mojej mocy, aby przybliżyć Czytelnikowi narzędzia i strategie potrzebne do kontynuowania nauki po przeczytaniu tej książki.

Zadaniem Czytelnika jest wykorzystanie tych informacji w konkretnych powierzonych mu zadaniach programistycznych. Oczywiście mam świadomość, że prawdziwe projekty nie dotyczą pojazdów o pieszczotliwych nazwach (jak BMW o imieniu Zippy czy też Yugo Clunker), ale o to właśnie chodzi w wiedzy stosowanej!

Zapewniam, że po przyswojeniu zagadnień i pojęć przedstawionych w tym tekście Czytelnik będzie świetnie przygotowany do tworzenia rozwiązań .NET odpowiadających jego własnemu, niepowtarzalnemu środowisku programowania.

Przegląd zawartości książki

Książka Język C# 2010 i platforma .NET 4.0 została podzielona na siedem niezależnych logicznie części, a każda z nich zawiera pewną liczbę powiązanych ze sobą rozdziałów. Osoby znające poprzednie wydania tego tekstu szybko zauważą kilka zmian. Na przykład tym razem nie ma osobnego rozdziału poświęconego nowym elementom języka C# – zostały omówione tam, gdzie naturalnie pasują do głównego tematu. Co więcej, w odpowiedzi na komentarze od czytelników znacznie rozbudowałem omówienie WPF (Windows Presentation Foundation). Poniżej przegląd tekstu część po części i rozdział po rozdziale.

Część 1. Wprowadzenie do języka C# i platformy .NET

Celem części 1 jest oswojenie Czytelnika z naturą platformy .NET i różnymi narzędziami programistycznymi (wiele z nich udostępniono na licencji open source), używanymi w trakcie tworzenia aplikacji .NET. Jednocześnie zapoznamy się z kilkoma podstawowymi cechami języka C# oraz systemu typów .NET.

Rozdział 1. Filozofia platformy .NET

Pierwszy rozdział to fundament, na którym spoczywa pozostała część tekstu. Zaczniemy od sentymentalnej podróży do pełnego przeszkód świata tradycyjnego pisania programów do Windows. Jednakże głównym celem tego rozdziału jest omówienie kilku bloków budulcowych platformy .NET, takich jak CLR (wspólne środowisko uruchomieniowe, Common Language Runtime), CTS (wspólny system typów, Common Type System), CLS (wspólna specyfikacja językowa, Common Language Specification) oraz biblioteki klas bazowych. Po raz pierwszy zobaczymy kod pisany w języku C# oraz format pakietu .NET. Rozdział zawiera również omówienie niezależności platformy .NET od systemu operacyjnego (zagadnienie to zostało wyczerpująco przedstawione w załączniku B).

Rozdział 2. Tworzenie aplikacji w języku C#

Rozdział ten jest przede wszystkim wprowadzeniem do kompilowania plików z kodem źródłowym C# za pomocą różnych narzędzi i technik. Na początku dowiemy się, jak używać kompilatora w wierszu polecenia (csc.exe) oraz plików odpowiedzi C#. W dalszej części rozdziału przedstawiłem kilka edytorów kodu oraz zintegrowanych środowisk programowania (IDE), w tym Notepad++, SharpDevelop, Visual C# 2010 Express oraz Visual Studio. Dowiemy się również, jak skonfigurować na komputerze programisty lokalną instalację wszystkich ważnych dokumentów z .NET Framework 4.0 SDK.

Część 2. Podstawowe konstrukcje programistyczne C#

Zagadnienia przedstawione w tej części książki są bardzo ważne, ponieważ będziemy je wykorzystywać niezależnie od kategorii tworzonych aplikacji .NET (mogą to być np. aplikacje sieciowe, aplikacje z interfejsem graficznym, biblioteki kodu albo usługi Windows). W części tej wyjaśniono podstawowe konstrukcje języka C#, w tym te związane z programowaniem obiektowym. Poza tym omówiono przetwarzanie wyjątków w czasie wykonywania programu oraz odśmiecanie .NET.

Rozdział 3. Podstawowe konstrukcje programistyczne C#. Część 1

Tym rozdziałem zaczynamy formalną naukę języka programowania C#. Poznamy rolę metody Main()oraz wiele szczegółów na temat wbudowanych typów danych .NET, w tym operacje na danych tekstowych za pomocą typów System.String i System.Text.StringBuilder. Omówiono również konstrukcje iteracyjne i decyzyjne, operacje zawężania i poszerzania oraz słowo kluczowe unchecked.

Rozdział 4. Podstawowe konstrukcje programistyczne języka C#. Część 2

W tym rozdziale zakończymy omówienie podstawowych aspektów języka programowania C#, zaczynając od tworzenia przeciążanych metod i definiowania parametrów za pomocą słów kluczowych out, ref i params. W rozdziale zostaną omówione dwa nowe elementy języka C# 2010, mianowicie argumenty i opcjonalne parametry. Dowiemy się również, jak tworzyć tablice danych i wykonywać na nich operacje, jak definiować typy danych nullable (za pomocą operatorów ? i ??) oraz poznamy różnicę między typami wartościowymi (do których należą wyliczenia i niestandardowe struktury) a typami referencyjnymi.

Rozdział 5. Klasy i enkapsulacja

W tym rozdziale zaczniemy poznawać programowanie obiektowe w języku C#. Po opanowaniu filarów programowania obiektowego (enkapsulacja, dziedziczenie i polimorfizm), dowiemy się, jak za pomocą konstruktorów, właściwości, składowych statycznych, stałych i pól tylko do odczytu tworzyć solidne klasy. Na zakończenie rozdziału zostawiono omówienie definicji typów częściowych, składnię inicjalizacji obiektów oraz właściwości automatyczne.

Rozdział 6. Dziedziczenie i polimorfizm

W tym rozdziale zbadane zostały dwa pozostałe filary programowania obiektowego, czyli dziedziczenie i polimorfizm. Dzięki nim możliwe jest tworzenie rodzin klas. W trakcie omawiania tego zagadnienia poznamy rolę metod wirtualnych, metod abstrakcyjnych (i abstrakcyjnych klas bazowych) oraz naturę interfejsu polimorficznego. Na końcu wyjaśniono bardzo ważną rolę najwyższej klasy bazowej na platformie .NET, mianowicie System.Object.

Rozdział 7. Strukturalna obsługa wyjątków

Celem tego rozdziału jest wyjaśnienie, jak stosując strukturalną obsługę wyjątków w kodzie programu, radzić sobie z anomaliami w czasie jego wykonywania. Poznamy nie tylko słowa kluczowe języka C# (try, catch, throw i finally), przeznaczone właśnie do takich zadań, ale też różnicę między wyjątkami na poziomie aplikacji a wyjątkami na poziomie systemu. Poza tym w rozdziale omówiono różne narzędzia środowiska Visual Studio 2010, pozwalające debugować wyjątki, które umkną naszym oczom.

Rozdział 8. Czas życia obiektu

W ostatnim w tej części rozdziale wyjaśniam, w jaki sposób środowisko CLR zarządza pamięcią za pomocą odśmiecania .NET. Poznamy rolę korzeni aplikacji, generacji obiektów oraz typu System.GC. Po tych podstawach przejdziemy do zbadania tematu obiektów jednorazowych (za pomocą interfejsu IDisposable) oraz finalizacji (za pomocą metody System.Object.Finalize()). W rozdziale tym poznamy również klasę Lazy<T>, która pojawiła się dopiero w .NET 4.0 – pozwala ona definiować dane, które zostaną alokowane dopiero po zażądaniu przez wywołującego. Jak się przekonamy, funkcja ta może być bardzo przydatna, kiedy chcemy mieć pewność, że nie zagracamy sterty obiektami, które są niepotrzebne bieżącemu programowi.

Część 3. Zaawansowane konstrukcje programistyczne C#

W tej części książki pogłębimy znajomość języka C#, omawiając kilka bardziej zaawansowanych, ale bardzo ważnych koncepcji. Zakończymy omawianie systemu typów .NET na interfejsach i delegacjach. Poznamy też rolę typów generycznych, po raz pierwszy przyjrzymy się LINQ (Language Integrated Query) oraz zbadamy kilka bardziej zaawansowanych elementów języka C# (np. metody rozszerzające, metody częściowe i manipulowanie wskaźnikami).

Rozdział 9. Interfejsy

Rozdział ten, poświęcony programowaniu z wykorzystaniem interfejsów, opiera się na zdobytej wcześniej wiedzy o programowaniu obiektowym. Dowiemy się, jak definiować klasy i struktury, które obsługują wiele zachowań, jak wykrywać te zachowania w trakcie wykonywania programu i jak wybiórczo ukrywać poszczególne zachowania za pomocą jawnej implementacji interfejsu. Utworzymy kilka niestandardowych interfejsów, a poza tym nauczymy się implementować interfejsy standardowe, które można znaleźć na platformie .NET. Użyjemy ich przy konstruowaniu obiektów, które można sortować, kopiować, wyliczać i porównywać.

Rozdział 10. Typy generyczne

W tym rozdziale zajmiemy się typami generycznymi. Jak się przekonamy, programowanie generyczne umożliwia tworzenie typów i składowych, zawierających różne wypełniacze, które mogą zostać określone przez wywołującego. Krótko mówiąc, typy generyczne znacznie polepszają wydajność aplikacji i bezpieczeństwo typów. Nie tylko poznamy różne typy generyczne z przestrzeni nazw System.Collections.Generics, ale nauczymy się też tworzyć własne generyczne metody i typy (z ograniczeniami i bez).

Rozdział 11. Delegaty, zdarzenia i lambdy

Celem tego rozdziału jest demistyfikacja typów zwanych delegatami. Mówiąc najprościej, delegat .NET to obiekt, który wskazuje na inne metody w aplikacji. Używając takiego typu, możemy tworzyć systemy, które pozwalają wielu obiektom brać udział w konwersacji dwustronnej. Po omówieniu stosowania delegatów .NET poznamy słowo kluczowe event, pozwalające uprościć programowanie z wykorzystaniem delegatów. Rozdział zakończymy omówieniem roli operatora lambda (=>) w języku C# oraz zależności między delegatami, metodami anonimowymi i wyrażeniami lambda.

Rozdział 12. Zaawansowane elementy języka C#

W tym rozdziale poszerzymy znajomość języka programowania C# o kilka zaawansowanych technik programowania. Nauczymy się przeciążać operatory i tworzyć niestandardowe funkcje konwersyjne (zarówno jawne, jak i niejawne) dla typów. Dowiemy się również, jak tworzyć indeksatory typów i komunikować się z nimi, a także jak używać metod rozszerzających, typów anonimowych, metod częściowych i wskaźników C# w kontekście kodu unsafe.

Rozdział 13. LINQ to Objects

W tym rozdziale zaczniemy poznawać LINQ (Language Integrated Query). LINQ pozwala tworzyć zapytania ze ścisłą kontrolą typów, które można wykorzystywać do operowania na danych (w najszerszym sensie tego słowa) w licznych scenariuszach. Tutaj poznamy LINQ to Objects, który pozwala stosować wyrażenia LINQ z kontenerami danych (np. tablicami, kolekcjami i typami niestandardowymi). Informacje te bardzo przydadzą się w dalszej części tej książki, kiedy będziemy zajmowali się wieloma innymi API LINQ (np. LINQ to XML, LINQ to DataSet, PLINQ i LINQ to Entities).

Część 4. Programowanie z wykorzystaniem pakietów .NET

W części czwartej szczegółowo omówiony został format pakietu .NET. Nie tylko dowiemy się, jak wdrażać i konfigurować biblioteki kodu .NET, ale poznamy też wewnętrzną budowę binarnego obrazu .NET. W części tej wyjaśniono również: rolę atrybutów .NET, znaczenie uzyskiwania informacji o typie w trakcie wykonywania programu, rolę środowiska DLR (Dynamic Language Runtime) w .NET 4.0 oraz zadania wprowadzonego w języku C# 2010 słowa kluczowego dynamic. Kolejne rozdziały zostały poświęcone tematom raczej zaawansowanym, takim jak kontekst obiektów, kod CIL oraz budowa pakietów istniejących tylko w pamięci.

Rozdział 14. Konfigurowanie pakietów .NET

Bardzo ogólnie rzecz biorąc, pakiet to po prostu nazwa binarnego pliku *.dll lub *.exe, utworzonego przez kompilator .NET. Jednak prawdziwa historia pakietów .NET jest znacznie ciekawsza. W tym rozdziale dowiemy się, na czym polega różnica między pakietami jedno- i wieloplikowymi, a także nauczymy się tworzyć i wdrażać zarówno jedne, jak i drugie. Dowiemy się też, jak konfigurować prywatne i współdzielone pakiety za pomocą plików *.config w formacie XML oraz pakietów z zasadami wydawcy. Jednocześnie poznamy wewnętrzną strukturę globalnego bufora pakietów (GAC), a przy okazji dowiemy się o kilku zmianach wprowadzonych w .NET 4.0.

Rozdział 15. Refleksja typów, późne wiązanie i programowanie z wykorzystaniem atrybutów

W rozdziale 15 kontynuujemy omawianie pakietów .NET, przyglądając się procesowi wykrywania typów w czasie wykonywania programu za pomocą przestrzeni nazw System.Reflection. Używając typów z tej przestrzeni nazw, możemy tworzyć aplikacje potrafiące w locie odczytywać metadane pakietu. Nauczymy się również dynamicznie ładować i tworzyć typy w czasie wykonywania programu – w tym celu poznamy mechanizm późnego wiązania. Na zakończenie rozdziału zajmiemy się rolą atrybutów .NET (zarówno standardowych, jak i niestandardowych). Aby zilustrować przydatność każdego z tych zagadnień, pokazuję, jak napisać rozszerzalną aplikację Windows Forms.

Rozdział 16. Procesy, domeny aplikacji i konteksty obiektów

Mając gruntowną wiedzę na temat pakietów, w tym rozdziale możemy dokładniej poznać budowę załadowanego do pamięci wykonywalnego pliku .NET. Celem tego rozdziału jest przedstawienie związków między procesami, domenami aplikacji i granicami kontekstów. Zagadnienia te stanowią fundament dla materiału z rozdziału 19, w którym zajmiemy się tworzeniem aplikacji wielowątkowych.

Rozdział 17. Język CIL oraz rola pakietów dynamicznych

Rozdział ten ma dwa cele. W jego pierwszej części znacznie dokładniej niż wcześniej przyjrzymy się składni i semantyce języka CIL. Na pozostałych stronach omówiona zostanie rola przestrzeni nazw System.Reflection.Emit. Typy te umożliwiają pisanie programów, które potrafią generować pakiety .NET w pamięci w czasie swojego działania. Mówiąc formalnie, pakiety definiowane i wykonywane w pamięci noszą nazwę pakietów dynamicznych. Nie należy mylić tego określenia z typami dynamicznymi, którym poświęcono rozdział 18.

Rozdział 18. Typy dynamiczne i DLR (Dynamic Language Runtime)

W .NET 4.0 wprowadzono nowy aspekt środowiska uruchomieniowego .NET, mianowicie DLR (Dynamic Language Runtime). Używając DLR i słowa kluczowego języka C# dynamic, możemy definiować dane, które naprawdę ustalone zostają dopiero w czasie wykonywanie programu. Używanie tych funkcji radykalnie upraszcza kilka bardzo złożonych zadań programistycznych na platformie .NET. W tym rozdziale poznamy kilka praktycznych zastosowań danych dynamicznych, takich jak uproszczone korzystanie z API refleksji .NET czy też znacznie łatwiejsza komunikacja z przestarzałymi bibliotekami COM.

Część 5. Wprowadzenie do bibliotek klas bazowych .NET

Na tym etapie Czytelnik powinien już dobrze znać język C# oraz budowę pakietu .NET. W części 5 wykorzystamy tę wiedzę do zbadania kilku popularnych usług znajdujących się w bibliotekach klas bazowych, służących m.in. do tworzenia aplikacji wielowątkowych, wykonywania plikowych operacji wejścia/wyjścia oraz umożliwiających dostęp do baz danych za pomocą ADO.NET. W części tej omówiono również tworzenie za pomocą WCF (Windows Communication Foundation) aplikacji rozproszonych, aplikacje z przepływem pracy wykorzystujące API Windows Workflow Foundation (WF) oraz API LINQ to XML.

Rozdział 19. Programowanie wielowątkowe oraz równoległe

W rozdziale tym omówiono tworzenie aplikacji wielowątkowych oraz zilustrowano kilka technik pozwalających zapewnić bezpieczeństwo wątków. Zaczniemy na wszelki wypadek od powtórki z delegatów .NET, wyjaśniając wewnętrzną obsługę asynchronicznego wywoływania metod. Następnie zbadamy typy z przestrzeni nazw System.Threading. W pozostałej części rozdziału zajmiemy się kolejną nowością w .NET 4.0, mianowicie interfejsem API o nazwie TPL (Task Parallel Library). Używając TPL, programiści .NET mogą tworzyć aplikacje, które bardzo sprytnie rozkładają zadania na wszystkie dostępne procesory. W tym momencie poznamy również rolę PINQ (Parallel LINQ), który daje możliwość tworzenia zapytań LINQ skalowanych na wiele rdzeni maszyny.

Rozdział 20. Plikowe operacje wejścia/wyjścia oraz serializacja obiektów

Przestrzeń nazw System.IO umożliwia komunikację ze strukturą plików i katalogów na komputerze. Z tego rozdziału dowiemy się, jak tworzyć (i kasować) system katalogów w kodzie programu. Nauczymy się również przenosić dane do i z różnych strumieni (np. plików, łańcuchów i pamięci). Następnie omówione zostaną dostępne na platformie .NET usługi polegające na serializacji obiektów. Mówiąc najprościej, serializacja pozwala utrwalić stan obiektu (lub zbioru powiązanych ze sobą obiektów) w strumieniu w celu późniejszego wykorzystania. Deserializacja natomiast, jak łatwo się domyślić, to proces polegający na wydobywaniu obiektu ze strumienia do pamięci, aby mógł zostać wykorzystany przez aplikację. Po omówieniu podstaw dowiemy się jak dostosować proces serializacji za pomocą interfejsu ISerializable oraz zbioru atrybutów .NET.

Rozdział 21. ADO.NET Część 1. Warstwa połączeniowa

W tym pierwszym (z trzech) rozdziałów poświęconych bazom danych po raz pierwszy przyjrzymy się interfejsowi dostępu do baz danych na platformie .NET, czyli ADO.NET. Konkretnie rozdział ten jest wprowadzeniem do roli dostawców danych .NET oraz komunikacji z relacyjną bazą danych za pomocą warstwy połączeniowej ADO.NET, reprezentowaną przez obiekty Connection, Command, Transaction i DataReader. Oprócz tego w rozdziale tym pokazano krok po kroku tworzenie niestandardowej bazy danych oraz pierwszą wersję niestandardowej biblioteki dostępu do danych (AutoLotDAL.dll). Biblioteki tej będziemy używać w dalszej części książki.

Rozdział 22. ADO.NET Część 2. Warstwa bezpołączeniowa

W tym rozdziale kontynuujemy poznawanie operacji bazodanowych, badając warstwę bezpołączeniową ADO.NET. Poznamy rolę typu DataSet, a także adaptery danych. Dowiemy się również o wielu narzędziach Visual Studio 2010, które potrafią znacznie uprościć tworzenie aplikacji opartych na danych. Jednocześnie dowiemy się, jak wiązać obiekty DataTable z elementami interfejsu użytkownika, a także jak stosować zapytania LINQ do znajdujących się w pamięci obiektów DataSet, używając LINQ to DataSet.

Rozdział 23. ADO.NET Część 3. The Entity Framework

W tym rozdziale zakończymy poznawanie ADO.NET, badając rolę Entity Framework (EF). Ogólnie rzecz biorąc, EF to sposób na tworzenie kodu dostępu za pomocą klas ze ścisłą kontrolą typów, które bezpośrednio przekładają się na model biznesowy. Omówiona zostanie rola EF Object Services, Entity Client oraz Object Context, a także budowa pliku *.edmx. Przy okazji nauczymy się komunikować z relacyjnymi bazami danych za pomocą LINQ to Entities. Zbudujemy również ostateczną wersję niestandardowej biblioteki dostępu do danych (AutoLotDAL.dll), której użyjemy w kilku następnych rozdziałach.

Rozdział 24. LINQ to XML

Rozdział 14 wprowadza do podstawowego modelu programowania LINQ, a konkretnie LINQ to Objects, w tym natomiast pogłębimy znajomość tego języka, dowiadując się, jak stosować zapytania LINQ do dokumentów XML. Zaczniemy od przypomnienia kilku „usterek”, które pojawiały się przy pierwszych próbach używania typów z pakietu System.Xml.dll do pracy z XML w poprzednich wersjach .NET. Mając za sobą tę krótką lekcję z historii, dowiemy się, jak tworzyć dokumenty XML w pamięci, jak utrwalać je na twardym dysku i jak nawigować po ich zawartości, używając modelu programowania LINQ (LINQ to XML).

Rozdział 25. Wprowadzenie do WCF (Windows Communication Foundation)

Aż do tego momentu wszystkie przykładowe aplikacje były wykonywane na pojedynczym komputerze. W tym rozdziale poznamy interfejs API Windows Communication Foundation (WCF), który pozwala tworzyć rozproszone aplikacje symetrycznie, niezależnie od tego, co zawierają „pod maską”. Przedstawiona zostanie budowa usług, hostów i klientów WCF. Jak się przekonamy, usługi WCF są bardzo elastyczne, ponieważ umożliwiają klientom i hostom deklaratywne określanie adresów, dowiązań i kontraktów w plikach konfiguracyjnych XML. W rozdziale tym przybliżę również kilka przydatnych sztuczek wprowadzonych w .NET 4.0.

Rozdział 26. Wprowadzenie do Windows Workflow Foundation

Windows Workflow Foundation stanowi dla wielu nowych programistów największy problem ze wszystkich API platformy .NET. Prawdę mówiąc, w wersji 4.0 API WF (wprowadzony w .NET 3.0) został kompletnie zmieniony. W tym rozdziale zaczniemy od poznania roli aplikacji z przepływem pracy, a następnie poznamy różne sposoby modelowania procesów biznesowych za pomocą API WF .NET 4.0. Następnie omówimy zasięg biblioteki aktywności WF 4.0, a także nauczymy się tworzyć aktywności niestandardowe, wykorzystujące napisaną wcześniej niestandardową bibliotekę dostępu do baz danych.

Część 6. Tworzenie interfejsów użytkownika końcowego na podstawie WPF

Wydając .NET 3.0, Microsoft udostępnił programistom niesamowity API o nazwie Windows Presentation Foundation (WPF). API ten szybko stał się dla nas prawowitym następcą modelu programowania Windows Forms. Krótko mówiąc, WPF umożliwia tworzenie aplikacji pulpitowych, które zawierają grafikę wektorową, interaktywne animacje oraz pozwalają na dowiązywanie danych za pomocą deklaratywnej gramatyki znaczników o nazwie XAML. Co więcej, architektura kontrolek WPF pozwala w prosty sposób radykalnie zmieniać wygląd i zachowania typowej kontrolki – wystarcza do tego trochę prawidłowych znaczników XAML. Z radością oznajmiam, że to wydanie książki zawiera pięć rozdziałów poświęconych w całości modelowi programowania WPF.

Rozdział 27. Wprowadzenie do WPF (Windows Presentation Foundation) i XAML

Ogólnie rzecz biorąc, WPF pozwala tworzyć interaktywne i multimedialne nakładki na aplikacje pulpitowe (a pośrednio również na aplikacje sieciowe). Inaczej niż w Windows Forms, w tym przebogatym frameworku interfejsu użytkownika wiele kluczowych usług (np. grafika 2D i 3D, animacje i interaktywne dokumenty) zintegrowano w jednolity i bogaty model obiektowy. W tym rozdziale zaczniemy poznawać Windows Presentation Foundation oraz XAML (Extendable Application Markup Language). Nauczymy się pisać programy WPF bez języka XAML, programy WPF w samym języku XAML oraz wykorzystując oba podejścia. Na koniec rozdziału napiszemy niestandardowy edytor XAML, którego będziemy używać w pozostałych rozdziałach poświęconych WPF.

Rozdział 28. Programowanie z wykorzystaniem kontrolek WPF

W rozdziale tym omówimy używanie wbudowanych kontrolek WPF oraz menedżerów rozmieszczenia elementów. Na przykład nauczymy się tworzyć systemy menu, dzielone okna, paski narzędzi i paski stanu. Rozdział ten jest zarazem wprowadzeniem do wielu API WPF (oraz związanych z nimi kontrolek), w tym WPF Documents, WPF Ink oraz modelu dowiązywania danych. Kolejnym ważnym tematem jest wprowadzenie do IDE Expression Blend, które to środowisko ułatwia tworzenia bogatych interfejsów użytkownika do aplikacji WPF.

Rozdział 29. Renderowania grafiki WPF

Ponieważ WPF to API intensywnie wykorzystujący grafikę, zapewnia trzy sposoby jej renderowania: kształty, rysunki i geometrie oraz ilustracje. W tym rozdziale przyjrzymy się każdej z tych opcji, a przy okazji poznamy wiele ważnych prostych typów graficznych (np. pędzle, pióra i transformacje). W rozdziale omówiono też wiele sposobów upraszczania przez Expression Blend tworzenia grafiki WPF, a także testowanie trafień na danych graficznych.

Rozdział 30. Zasoby, animacje i style WPF

Rozdział ten wprowadza do trzech ważnych (i powiązanych ze sobą) zagadnień, które pogłębią zrozumienie interfejsu WPF. Zaczniemy od omówienia roli zasobów logicznych. Jak się przekonamy, system zasobów logicznych (zwany również zasobem obiektowym) to sposób na nazywanie powszechnie używanych obiektów w aplikacji WPF i odwoływanie się do nich. Następnie nauczymy się definiować i wykonywać sekwencję animacji oraz nią sterować. Wbrew pozorom, animacje WPF nie ograniczają się do gier wideo czy aplikacji multimedialnych. Na zakończenie rozdziału poznamy rolę stylów WPF. Podobnie jak na stronie internetowej można używać stylów CSS albo silnika motywów ASP.NET, również w aplikacji WPF można zdefiniować wspólny wygląd zbioru kontrolek.

Rozdział 31. Szablony kontrolek WPF oraz kontrolki użytkownika

W tym rozdziale zakończymy badanie modelu programowania WPF, wprowadzając tworzenie dostosowanych kontrolek. Zaczniemy od omówienia dwóch tematów ważnych przy tworzeniu niestandardowej kontrolki: właściwości zależnościowych i zdarzeń trasowanych. Następnie poznamy rolę szablonów domyślnych, a poza tym dowiemy się, jak przeglądać je w trakcie wykonywania programu. W dalszej części rozdziału powiem, jak wykorzystując tę wiedzę, tworzyć niestandardowe klasy kontrolek użytkownika w Visual Studio 2010 oraz Expression Blend, z uwzględnieniem .NET 4.0 Visual State Manager.

Część 7. Tworzenie aplikacji sieciowych za pomocą ASP.NET

Część 7 jest poświęcona tworzeniu aplikacji sieciowych za pomocą API ASP.NET. Microsoft tworzył ASP.NET z myślą o modelowaniu interfejsów użytkownika końcowego i umieścił obiektowy, oparty na zdarzeniach framework na wierzchu standardowego mechanizmu żądania/odpowiedzi HTTP.

Rozdział 32. Tworzenie internetowych stron ASP.NET

W tym rozdziale zaczynamy tworzenie aplikacji sieciowych za pomocą ASP.NET. Jak się okaże, skrypty po stronie serwera zostały zastąpione prawdziwymi językami obiektowymi (np. C# i VB .NET). W tym rozdziale omówiono budowę strony ASP.NET, stosowany model programowania oraz inne kluczowe aspekty ASP.NET, takie jak wybór serwera WWW oraz używanie plików Web.config.

Rozdział 33. Kontrolki sieciowe, strony wzorcowe i motywy ASP.NET

W poprzednim rozdziale omówiono konstruowanie obiektów Page ASP.NET, natomiast w tym zbadamy kontrolki wypełniające wewnętrzne drzewo kontrolek. Przedstawione zostaną najważniejsze kontrolki sieciowe ASP.NET, w tym walidacyjne, wbudowane kontrolki nawigacji po witrynie oraz różne wiązania danych. Rozdział ten również zawiera omówienie roli stron wzorcowych oraz silnika motywów ASP.NET, będącego serwerową alternatywą dla tradycyjnych arkuszy stylów.

Rozdział 34. Techniki zarządzania stanem ASP.NET

W tym rozdziale pogłębimy wiedzę o ASP.NET, badając różne sposoby zarządzania stanem na platformie .NET. Podobnie jak w klasycznym ASP, w ASP.NET możemy bezproblemowo tworzyć pliki cookie oraz zmienne na poziomie sesji i aplikacji. Jednak ASP.NET wprowadza nową technikę zarządzania stanem: bufor aplikacji. Po poznaniu licznych sposobów zarządzania stanem w ASP.NET zbadamy rolę klasy bazowej HttpApplication i dowiemy się, jak dynamicznie zmieniać działanie wykonywanej aplikacji sieciowej za pomocą pliku Web.config.

Załączniki

W ostatniej części książki omówione zostały dwa zagadnienia, które nie mają naturalnego, bezpośredniego związku z resztą tekstu i dlatego postanowiłem zająć się nimi w załącznikach. Poznawanie języka C# oraz platformy .NET zakończymy przeglądem pierwotnego frameworku do tworzenia graficznych interfejsów użytkownika na platformie .NET, czyli Windows Forms. Omówię również platformę Mono, pozwalającą tworzyć aplikacje .NET w systemach operacyjnych innych niż Microsoft Windows.

Załącznik A. Programowanie z wykorzystaniem Windows Forms

Oryginalny zbiór narzędzi do tworzenia GUI dostarczany z platformą .NET nosi nazwę Windows Forms. Omawiam rolę tego frameworku i informuję, jak tworzyć okna główne, okna dialogowe oraz systemy menu. Poznamy również rolę dziedziczenia formatek i przekonamy się, jak można renderować dane graficzne 2D za pomocą przestrzeni nazw System.Drawing. Na zakończenie napiszemy (bardzo prostą) aplikację do malowania, będącą ilustracją różnych zagadnień omówionych w tym załączniku.

Załącznik B. Mono – tworzenie aplikacji .NET niezależnie od platformy systemowej

Na samym końcu zajmiemy się tematem nie mniej ważnym: w dodatku B omówiona została implementacja open source platformy .NET o nazwie Mono. Pozwala ona projektować bogate w funkcje aplikacje .NET, które można tworzyć, wdrażać i wykonywać w wielu systemach operacyjnych, w tym Mac OS X, Solaris, AIX i wielu innych dystrybucjach Linuksa. Ponieważ Mono jest pod wieloma względami porównywalne z platformą .NET Microsoftu, jego możliwości są nam w dużej mierze znane. Dlatego skupimy się na instalacji, narzędziach programistycznych i silniku uruchomieniowym Mono.

Kod źródłowy do książki

Całość przykładowego kodu z tej książki można bezpłatnie pobrać w sekcji Source Code witryny Apress. Wystarczy otworzyć stronę www.apress.com, kliknąć odsyłacz Source Code i znaleźć tytuł książki. Na stronie poświęconej książce Pro C# 2010 and the .NET 4.0 Platform, Fifth Edition można pobrać samorozpakowujący się plik *.zip. Po rozpakowaniu zawartości zauważymy, że kod został podzielony na rozdziały.

Przy okazji wspomnę, że w wielu rozdziałach tej książki są takie ramki jak poniższa. To wizualne wskazówki, że omawiany przykład można pobrać i wczytać do Visual Studio 2010, a następnie badać i modyfikować:

Kod źródłowy. Informacja, że kod źródłowy znajduje się w konkretnym katalogu w archiwum ZIP!

Aby otworzyć rozwiązanie w Visual Studio 2010, z menu File wybieramy polecenie Open Project/Solution, a następnie wskazujemy odpowiedni plik z rozszerzeniem .sln, znajdujący się w odpowiednim podkatalogu rozpakowanego archiwum.

Aktualizacje

W trakcie lektury tego tekstu Czytelnik może czasami natrafić na jakiś błąd gramatyczny albo w kodzie. Mam nadzieję, że tak się nie stanie, ale w przeciwnym razie proszę o przyjęcie przeprosin. Jestem tylko człowiekiem i mimo najlepszych starań jeden czy dwa błędy mogły mi się przytrafić. A jeśli tak się stało, bieżącą erratę można znaleźć w witrynie Apress (znajduje się na stronie poświęconej książce). Jest tam również informacja, w jaki sposób można mnie poinformować o znalezionych błędach.

Kontakt ze mną

Jeśli ktoś ma pytania dotyczące kodu źródłowego z tej książki, potrzebuje wyjaśnienia konkretnego przykładu albo po prostu chce się podzielić przemyśleniami na temat platformy .NET, zachęcam do napisania do mnie kilku słów na poniższy adres (aby mail nie wylądował w koszu na śmieci, w temacie należy umieścić frazę „C# FifthEd):

atroelsen@intertech.com

Zapewniam, że zrobię co w mej mocy, aby szybko odpowiedzieć. Jednak od czasu do czasu jestem trochę zajęty – jak każdy. Jeśli nie odpowiem w ciągu tygodnia albo dwu, to nie dlatego, że jestem gburem i unikam rozmowy. Jestem po prostu zajęty (lub jeśli szczęście mi sprzyja – wypoczywam). Tak więc: dziękuję za kupienie tej książki (albo przynajmniej przeglądanie w księgarni i zastanawianie się nad kupnem). Mam nadzieję, że jej lektura sprawi przyjemność wszystkim Czytelnikom, a wiedza zostanie wykorzystana w dobrym celu.

Pozdrawiam

Andrew Troelsen