C# / Andrew Stellman, Jennifer Greene.
Transkrypt
C# / Andrew Stellman, Jennifer Greene.
C# / Andrew Stellman, Jennifer Greene. - wyd. 2. – Gliwice, cop. 2011 Spis treści Wstęp Dla kogo jest ta ksiąŜka? Wiemy, o czym myślisz Metapoznanie: myślenie o myśleniu Zmuś swój mózg do posłuszeństwa Przeczytaj to Grupa korektorów technicznych Podziękowania 30 31 33 35 37 38 39 Rozdział 1. Aplikacje Visual Studio w 10 minut lub mniej Dlaczego powinieneś uczyć się C# C# oraz Visual Studio ułatwiają wiele czynności PomóŜ dyrektorowi naczelnemu zrezygnować z papieru Sprawdź potrzeby Twoich uŜytkowników, zanim zaczniesz tworzyć program Oto program, który zamierzasz stworzyć Co robisz w Visual Studio Co Visual Studio robi za Ciebie Stwórz interfejs uŜytkownika Za kulisami Visual Studio Dodaj coś do automatycznie wygenerowanego kodu Potrzebujemy bazy danych do przechowywania naszych informacji IDE utworzyło bazę danych SQL jest swoim własnym językiem Tworzenie tabeli dla listy kontaktowej Zakończ tworzenie tabeli Wstaw dane z kart do bazy Połącz formularz z bazą danych, korzystając ze źródeł danych Dodaj kontrolki powiązane z bazą danych do formularza Jak zamienić TWOJĄ aplikację w aplikację WSZYSTKICH PrzekaŜ aplikację innym uŜytkownikom Jeszcze nie skończyłeś: przetestuj instalację Stworzyłeś pełnowartościową aplikację bazodanową 42 43 44 45 46 48 48 52 54 55 58 59 59 60 65 66 68 70 75 76 77 78 Rozdział 2. Pod maską Kiedy robisz to... ...IDE robi to Skąd się biorą programy IDE pomaga Ci kodować Kiedy zmieniasz coś w IDE, zmieniasz takŜe swój kod Anatomia programu Twój program wie, gdzie zacząć W tej samej przestrzeni nazw mogą być dwie klasy Twoje programy uŜywają zmiennych do pracy z danymi C# uŜywa znanych symboli matematycznych UŜyj debugera, by zobaczyć, jak zmieniają się wartości zmiennych Pętle wykonują czynność wielokrotnie 80 81 82 84 86 88 90 97 98 100 101 103 Kodowanie czas zacząć Instrukcje if/else podejmują decyzje Ustal warunki i sprawdź, czy są prawdziwe Rozdział 3. Tworzenie kodu ma sens W jaki sposób Maciek myśli o swoich problemach W jaki sposób system nawigacyjny w samochodzie Maćka rozwiązuje jego problemy Klasa Navigator napisana przez Maćka posiada metody do ustalania i modyfikacji tras Wykorzystaj to, czego się nauczyłeś, do napisania prostego programu uŜywającego klas Maciek moŜe uŜyć obiektów do rozwiązania swojego problemu UŜywasz klasy do utworzenia obiektu Kiedy tworzysz obiekt na podstawie klasy, to taki obiekt nazywamy instancją klasy Lepsze rozwiązanie... uzyskane dzięki obiektom! Instancja uŜywa pól do przechowywania informacji Stwórzmy kilka instancji! Dzięki za pamięć Co Twój program ma na myśli MoŜesz uŜywać nazw klas i metod w celu uczynienia kodu bardziej intuicyjnym Nadaj swojej klasie naturalną strukturę Diagramy klas pozwalają w sensowny sposób zorganizować klasy Utwórz klasę do pracy z kilkoma facetami Utwórz projekt dla facetów Utwórz formularz do interakcji z facetami Jest jeszcze prostszy sposób inicjalizacji obiektów Rozdział 4. Jest 10:00. Czy wiesz, gdzie są Twoje dane? Typ zmiennej określa rodzaj danych, jakie zmienna moŜe przechowywać Zmienna jest jak kubek z danymi 10 kilogramów danych w pięciokilogramowej torebce Nawet wtedy, gdy liczba ma prawidłowy rozmiar, nie moŜesz przypisać jej do kaŜdej zmiennej Kiedy rzutujesz wartość, która jest zbyt duŜa, C# dopasowuje ją automatycznie C# przeprowadza niektóre rzutowania automatycznie Kiedy wywołujesz metodę, zmienne muszą pasować do typów parametrów Połączenie = z operatorem TakŜe obiekty uŜywają zmiennych Korzystaj ze swoich obiektów za pomocą zmiennych referencyjnych Referencje są jak etykiety do Twoich obiektów JeŜeli nie ma juŜ Ŝadnej referencji, Twoje obiekty są usuwane z pamięci Referencje wielokrotne i ich efekty uboczne Dwie referencje oznaczają DWA sposoby na zmianę danych obiektu Specjalny przypadek: tablice Witamy w barze Niechlujny Janek - najtańsze kanapki w mieście! Obiekty uŜywają referencji do komunikacji między sobą 104 105 106 122 123 124 125 128 129 130 131 136 137 138 139 140 142 144 148 149 150 153 160 162 163 164 165 166 167 172 173 174 175 176 177 182 183 185 187 Tam, gdzie obiektów jeszcze nie było Napisz grę w literki 188 193 Laboratorium C# numer 1. Dzień na wyścigach Specyfikacja: stwórz symulator wyścigów Końcowy produkt 202 210 Rozdział 5. Co ma być ukryte... niech będzie ukryte Krystyna planuje przyjęcia Co powinien robić program szacujący? Jazda próbna Krystyny KaŜda opcja powinna być obliczana osobno Bardzo łatwo przez przypadek źle skorzystać z obiektów Hermetyzacja oznacza, Ŝe niektóre dane w klasie są prywatne UŜyj hermetyzacji w celu kontroli dostępu do metod i pól Twojej klasy Ale czy jego prawdziwa toŜsamość jest NAPRAWDĘ chroniona? Dostęp do prywatnych pól i metod moŜna uzyskać tylko z wnętrza klasy Hermetyzacja utrzymuje Twoje dane w nieskazitelnym stanie Właściwości sprawią, Ŝe hermetyzacja będzie łatwiejsza Stwórz aplikację do przetestowania klasy Farmer UŜyj automatycznych właściwości do ukończenia klasy Co wtedy, gdy chcemy zmienić pole mnoŜnika wyŜywienia? UŜyj konstruktora do inicjalizacji pól prywatnych 212 213 218 220 222 223 224 225 226 234 235 236 237 238 239 Rozdział 6. Drzewo genealogiczne Twoich obiektów Krystyna organizuje takŜe przyjęcia urodzinowe Potrzebujemy klasy BirthdayParty Stwórz program Planista przyjęć w wersji 2.0 Kiedy klasy uŜywają dziedziczenia, kod musi być napisany tylko raz Zbuduj model klasy, rozpoczynając od rzeczy ogólnych i przechodząc do bardziej konkretnych W jaki sposób zaprojektowałbyś symulator zoo? UŜyj dziedziczenia w celu uniknięcia zwielokrotniania kodu w klasach potomnych Pomyśl, w jaki sposób pogrupować zwierzęta Stwórz hierarchię klas KaŜda klasa pochodna rozszerza klasę bazową Klasa pochodna moŜe przesłaniać odziedziczone metody w celu ich modyfikacji lub zmiany W kaŜdym miejscu, gdzie moŜesz skorzystać z klasy bazowej, moŜesz zamiast niej uŜyć jednej z jej klas pochodnych Klasa pochodna moŜe ukrywać metody klasy bazowej UŜywaj override i virtual, by dziedziczyć zachowania Teraz jesteś juŜ gotowy do dokończenia zadania Krystyny Stwórz system zarządzania ulem Najpierw stworzysz system podstawowy UŜyj dziedziczenia, aby rozszerzyć system zarządzania pszczołami 248 249 250 258 259 260 261 263 264 265 270 271 278 280 284 289 290 294 Rozdział 7. Klasy, które dotrzymują swoich obietnic Wróćmy do pszczelej korporacji MoŜemy uŜyć dziedziczenia do utworzenia klas dla róŜnych typów pszczół Interfejs daje klasie do zrozumienia, Ŝe musi ona zaimplementować określone metody i właściwości UŜyj słowa kluczowego interface do zdefiniowania interfejsu Klasy implementujące interfejsy muszą zawierać WSZYSTKIE ich metody Nie moŜesz utworzyć instancji interfejsu, ale moŜesz uzyskać jego referencję Referencje interfejsów działają tak samo jak referencje obiektów Za pomocą "is" moŜesz sprawdzić, czy klasa implementuje określony interfejs Interfejsy mogą dziedziczyć po innych interfejsach Rzutowanie w górę działa w odniesieniu do obiektów i interfejsów Rzutowanie w dół pozwala zamienić urządzenie z powrotem w ekspres do kawy Rzutowanie w górę i w dół działa takŜe w odniesieniu do interfejsów Jest coś więcej niŜ tylko public i private Modyfikatory dostępu zmieniają widoczność Obiekty niektórych klas nigdy nie powinny być tworzone Klasa abstrakcyjna jest jak skrzyŜowanie klasy i interfejsu Metoda abstrakcyjna nie ma ciała Polimorfizm oznacza, Ŝe jeden obiekt moŜe przyjmować wiele róŜnych postaci Rozdział 8. Przechowywanie duŜej ilości danych Łańcuchy znaków nie zawsze sprawdzają się przy kategoryzowaniu danych Typy wyliczeniowe pozwalają Ci wyliczyć prawidłowe wartości Typy wyliczeniowe pozwalają na reprezentowanie liczb za pomocą nazw MoŜesz uŜyć tablicy, aby stworzyć talię kart... Listy są bardziej elastyczne niŜ tablice Typy generyczne mogą przechowywać kaŜdy typ Inicjalizatory kolekcji działają tak samo jak inicjalizatory obiektu Stwórzmy listę kaczek Listy są proste, ale SORTOWANIE moŜe być skomplikowane IComparable<T> pomoŜe Ci posortować listę kaczek UŜyj interfejsu IComparer, aby powiedzieć liście, jak ma sortować Utwórz instancję obiektu porównującego IComparer moŜe wykonywać złoŜone porównania Przesłonienie metody ToString pozwala obiektom przedstawiać się Zmień pętle foreach tak, by obiekty Duck i Card same się opisywały UŜywając IEnumerable, moŜesz rzutować całą listę w górę MoŜesz tworzyć własne przeciąŜone metody Wybrane funkcjonalności słownika Napisz program korzystający ze słownika I jeszcze WIĘCEJ typów kolekcji... Kolejka działa według reguły: pierwszy przyszedł, pierwszy wyszedł Stos działa według reguły: ostatni przyszedł, pierwszy wyszedł 300 301 302 303 305 308 309 310 311 315 316 317 321 322 325 326 329 337 356 357 358 361 364 368 372 373 374 375 376 377 378 381 382 384 385 392 393 405 406 407 Laboratorium C# numer 2. Wyprawa Specyfikacja: utwórz grę przygodową Zabawa dopiero się zaczyna! Rozdział 9. Zapisz tablice bajtów, zapisz świat C# uŜywa strumieni do zapisu i odczytu danych RóŜne strumienie zapisują i odczytują róŜne rzeczy FileStream zapisuje bajty do pliku W jaki sposób zapisać tekst do pliku w trzech prostych krokach Zapis i odczyt wymaga dwóch obiektów Dane mogą przechodzić przez więcej niŜ jeden strumień UŜyj wbudowanych obiektów do wyświetlenia standardowych okien dialogowych Okna dialogowe są kolejnymi kontrolkami .NET Okna dialogowe takŜe są obiektami UŜywaj wbudowanych klas File oraz Directory do pracy z plikami i katalogami UŜywaj okien dialogowych do otwierania i zapisywania plików Dzięki IDisposable obiekty usuwane są prawidłowo Unikaj błędów systemowych, korzystając z instrukcji using Zapisywanie danych do plików wymaga wielu decyzji UŜyj instrukcji switch do wyboru właściwej opcji Serializacja pozwala Ci zapisywać lub odczytywać całe obiekty naraz .NET automatycznie konwertuje tekst do postaci Unicode C# moŜe uŜyć tablicy bajtów do przesyłania danych Pliki utworzone dzięki serializacji moŜna takŜe zapisywać i odczytywać ręcznie Praca z plikami binarnymi moŜe być skomplikowana StreamReader i StreamWriter będą do tego odpowiednie UŜyj Stream.Read do odczytywania bajtów ze strumienia Rozdział 10. Gaszenie poŜarów nie jest juŜ popularne Damian potrzebuje swoich wymówek, aby być mobilnym Kiedy program zgłasza wyjątek, .NET tworzy obiekt Exception Wszystkie obiekty wyjątków dziedziczą po Exception Debuger pozwala Ci wyśledzić wyjątki w kodzie i zapobiec im UŜyj debugera wbudowanego w IDE, aby znaleźć problem w programie do zarządzania wymówkami ObsłuŜ wyjątki za pomocą try i catch Co się stanie, jeŜeli wywoływana metoda będzie niebezpieczna? UŜyj debugera do prześledzenia przepływu w blokach try/catch Jeśli posiadasz kod, który ZAWSZE musi zostać wykonany, zastosuj finally Jedna klasa zgłasza wyjątek, inna klasa go wyłapuje Pszczoły potrzebują wyjątku OutOfHoney Łatwy sposób na uniknięcie licznych problemów: using umoŜliwia Ci stosowanie try i finally za darmo Unikanie wyjątków: zaimplementuj IDisposable, aby przeprowadzić własne procedury sprzątania 412 432 434 435 436 437 441 442 445 446 447 448 451 453 454 460 461 468 473 474 477 479 481 482 488 492 496 497 498 503 504 506 508 515 516 519 520 Najgorszy z moŜliwych bloków catch: komentarze Tymczasowe rozwiązania są dobre tymczasowo Kilka wskazówek dotyczących obsługi wyjątków Damian w końcu pojechał na urlop... 522 523 524 527 Rozdział 11. Co robi Twój kod, kiedy nie patrzysz Czy kiedykolwiek marzyłeś o tym, aby Twoje obiekty potrafiły samodzielnie myśleć? Ale skąd obiekt WIE, Ŝe ma odpowiedzieć? Kiedy wystąpi ZDARZENIE... obiekty nasłuchują Jeden obiekt wywołuje zdarzenie, inne nasłuchują... Potem inne obiekty obsługują zdarzenie Łącząc punkty IDE automatycznie tworzy za Ciebie procedury obsługi zdarzeń Ogólny typ EventHandler pozwala definiować własne typy zdarzeń Wszystkie formularze, które utworzyłeś, uŜywają zdarzeń Jedno zdarzenie, wiele procedur obsługi Połączenie nadawców zdarzenia z jego odbiorcami Delegat ZASTĘPUJE właściwą metodę Delegat w akcji KaŜdy obiekt moŜe subskrybować publiczne zdarzenie... UŜyj funkcji zwrotnej, by wiedzieć, kto nasłuchuje Funkcje zwrotne są jedynie sposobem uŜywania delegatów 530 530 531 532 533 534 538 544 545 546 548 549 550 553 554 556 Rozdział 12. Wiedza, moc i tworzenie ciekawych rzeczy Przebyłeś długą drogę, mały Zajmowaliśmy się takŜe pszczołami Architektura symulatora ula Budowanie symulatora ula śycie i śmierć kwiatów Teraz potrzebujemy klasy Bee PPBP Programiści Przeciwko Bezdomnym Pszczołom Ul działa na miód Wypełnianie klasy Hive Metoda Go() klasy Hive Jesteśmy gotowi na stworzenie świata Tworzymy system turowy Oto kod klasy World Uczenie pszczół zachowań Główny formularz wywołuje Go() dla całego świata MoŜemy uŜyć obiektu World do pobrania statystyk Zegary sygnalizują zdarzenia wielokrotnie Za kulisami zegar uŜywa zdarzeń Pracujmy z grupami pszczół Kolekcje kolekcjonują... DANE LINQ ułatwia pracę z danymi w kolekcjach i bazach danych Ostatnie wyzwanie: Otwórz i Zapisz 564 565 566 567 571 572 576 576 580 581 582 583 584 590 592 593 594 595 602 603 605 607 Rozdział 13. Upiększ to Cały czas do interakcji z programami uŜywałeś kontrolek Kontrolki formularza są tylko obiektami UŜyj kontrolek do animacji symulatora ula Dodaj do projektu rendering Kontrolki są dobrze dostosowane do wyświetlania róŜnych elementów wizualnych Stwórz swoją pierwszą animowaną kontrolkę Utwórz przycisk, aby dodać BeeControl do formularza Twoje kontrolki takŜe muszą usuwać swoje kontrolki! UserControl to dobry sposób na tworzenie kontrolek Mechanizm renderujący uŜywa BeeControl do rysowania animowanych pszczół na formularzu Dodaj do projektu formularze reprezentujące ul i pole Stwórz klasę Renderer Zmieniłeś rozmiar bitmap przy pomocy obiektu Graphics Zasoby Twoich obrazków przechowywane są w postaci obiektów Bitmap UŜyj System.Drawing, by samemu PRZEJĄĆ KONTROLĘ nad grafiką 30-sekundowa podróŜ do świata tajemnic grafiki GDI+ UŜyj Graphics, aby na formularzu narysować obrazek Klasa Graphics moŜe usunąć problem przezroczystości... UŜyj zdarzenia Paint, aby grafika była mocno związana z formularzem BliŜsze spojrzenie na sposób rysowania formularzy i kontrolek Podwójne buforowanie czyni animację bardziej płynną UŜyj obiektu Graphics i procedury obsługi zdarzenia do drukowania Rozdział 14. Kapitan Wspaniały. Śmierć obiektu Twoją ostatnią szansą na ZROBIENIE czegoś... jest uŜycie finalizatora Kiedy DOKŁADNIE wywoływany jest finalizator? Dispose działa z using, a finalizatory działają z mechanizmem oczyszczania pamięci Finalizatory nie mogą polegać na stabilności Spraw, aby obiekt serializował się w Dispose Struktura jest podobna do obiektu... ...ale nie jest obiektem Wartości są kopiowane, referencje są przypisywane Stos i sterta: więcej na temat pamięci UŜywaj parametrów wyjściowych, by zwracać z metody więcej niŜ jedną wartość Przekazuj referencje, uŜywając modyfikatora ref UŜywaj parametrów opcjonalnych, by określać wartości domyślne Jeśli musisz uŜywać wartości pustych, stosuj typy, które je akceptują Typy akceptujące wartości puste poprawiają odporność programów Kapitan Wspaniały... nie tak bardzo Metody rozszerzające zwiększają funkcjonalność ISTNIEJĄCYCH klas Rozszerzanie podstawowego typu: string 612 613 614 616 618 621 624 625 626 628 630 631 640 641 642 643 644 649 650 653 656 662 676 677 678 680 681 685 685 686 689 692 693 694 695 696 699 700 702 Rozdział 15. Przejmij kontrolę nad danymi Łatwy projekt... ...ale dane są w róŜnych miejscach Dzięki LINQ moŜesz pobrać dane z róŜnych źródeł Kolekcje .NET są przystosowane do działania z LINQ LINQ ułatwia wykonywanie zapytań LINQ jest prosty, ale Twoje zapytania wcale takie być nie muszą LINQ ma wiele zastosowań LINQ moŜe połączyć Twoje wyniki w grupy Połącz wartości Janka w grupy UŜyj join do połączenia dwóch kolekcji w jednym zapytaniu Janek zaoszczędził mnóstwo szmalu Połącz LINQ z bazą danych SQL UŜyj join, aby połączyć dane Starbuzz i Papierni Obiektowo 708 709 710 711 712 713 716 721 722 725 726 728 732 Laboratorium C# numer 3. Invaders Dziadek wszystkich gier MoŜna zrobić znacznie więcej... 736 755 Dodatek A 11 najwaŜniejszych rzeczy, które chcieliśmy umieścić w tej ksiąŜce 1. Podstawy 2. Przestrzenie nazw i złoŜenia 3. UŜyj BackgroundWorker, by poprawić działanie interfejsu uŜytkownika 4. Klasa Type oraz metoda GetType() 5. Równość, IEquatable oraz Equals() 6. Stosowanie yield return do tworzenia obiektów umoŜliwiających iterację 7. Refaktoryzacja 8. Anonimowe typy i metody oraz wyraŜenia lambda 9. Serializacja przy uŜyciu DataContractSerializer 10. Zastosowanie LINQ to XML 11. Windows Presentation Foundation Czy wiesz, Ŝe C# i .NET Framework potrafią... 758 764 768 771 772 775 778 780 782 784 786 788 Skorowidz 791 oprac. BPK