background image

Wydawnictwo Helion

ul. Koœciuszki 1c

44-100 Gliwice

tel. 032 230 98 63

e-mail: helion@helion.pl

Microsoft Visual Studio 2005.

Ksiêga eksperta

Autor: Lars Powers, Mike Snell

T³umaczenie: Tomasz Walczak, Maria Chaniewska

ISBN: 83-246-0837-0

Tytu³ orygina³u: 

Microsoft Visual Studio 2005 Unleashed

Format: B5, stron: oko³o 848

oprawa twarda 

Zwiêksz swoj¹ produktywnoœæ dziêki Visual Studio 2005 oraz Team System

• Kompletny przegl¹d œrodowiska 

• Nowoœci w Visual Studio 2005 

• Praca zespo³owa w Team System

Microsoft nie zaprzestaje wysi³ków, doskonal¹c narzêdzia do tworzenia programów 

dla platformy .NET. Visual Studio 2005 to nastêpny krok w tym kierunku. Nowe 

w³aœciwoœci pozwalaj¹ jeszcze bardziej zwiêkszyæ wydajnoœæ programistów, poprawiæ 

komfort ich pracy i zautomatyzowaæ wykonywanie ¿mudnych zadañ, a wersja Team 

System umo¿liwia wspó³pracê ca³ych zespo³ów projektowych, w³¹czaj¹c w to 

mened¿erów projektu, architektów, programistów, testerów czy administratorów. 

Wieloœæ mo¿liwoœci i funkcji œrodowiska Visual Studio 2005 sprawia, ¿e nawet 

doœwiadczonym programistom przyda siê wszechstronne Ÿród³o wiedzy. 
Ksi¹¿ka „Microsoft Visual Studio 2005. Ksiêga eksperta” to podrêcznik, w którym 

wyczerpuj¹co omówiono to rozbudowane œrodowisko. Dziêki niemu poznasz elementy 

interfejsu u¿ytkownika potrzebne do utworzenia aplikacji od pocz¹tku do koñca 

- od przygotowywania projektu, poprzez pisanie i modyfikowanie kodu, a¿ po 

diagnozowanie i testowanie programu. Nauczysz siê korzystaæ z nowych funkcji 

Visual Studio 2005 umo¿liwiaj¹cych miêdzy innymi automatyzacjê testów, wydajn¹ 

refaktoryzacjê czy wi¹zanie danych bez koniecznoœci pisania kodu, co przyczyni siê 

do wzrostu Twej produktywnoœci. Dowiesz siê tak¿e, jak u¿ywaæ narzêdzi wersji Team 

System pozwalaj¹cych na sprawn¹ wspó³pracê wielu osób pracuj¹cych przy tworzeniu 

oprogramowania.

• Przegl¹d okien projektowych i edytorów 

• Praca z projektami i rozwi¹zaniami 

• Diagnozowanie kodu 

• Obs³uga baz danych 

• Refaktoryzacja kodu 

• Pisanie kreatorów, makr i dodatków 

• Tworzenie aplikacji sieciowych w ASP.NET 

• Pisanie i konsumowanie us³ug sieciowych 

• Automatyzacja testów 

• Zarz¹dzanie zmianami i kontrola wersji 

• Wspó³praca zespo³owa 

• Spo³ecznoœæ programistów .NET

Ta ksi¹¿ka to nieoceniona pomoc dla wszystkich u¿ytkowników Visual Studio 2005.

 

background image

Spis treści

O autorach  ..................................................................................................15
Wprowadzenie  ............................................................................................17

Część I Wprowadzenie do Visual Studio 2005 i .NET ..........................21

Rozdział 1. Krótki przegląd Visual Studio 2005  .........................................23

Kilka przydatnych usprawnień  ............................................................................................................ 23

Projektowanie, pisanie i przeglądanie kodu  .................................................................................. 24
Edycja i diagnozowanie kodu ........................................................................................................ 32
Współdzielenie (i wykorzystywanie) kodu w społeczności programistów ................................... 37
Uwzględnianie potrzeb różnych klientów  ..................................................................................... 38
Połączenie z danymi  ...................................................................................................................... 43
Automatyzacja testów aplikacji ..................................................................................................... 45

Przegląd wersji ..................................................................................................................................... 46

Wersje Express  .............................................................................................................................. 47
Wersja Standard ............................................................................................................................. 48
Wersja Professional  ....................................................................................................................... 48
Visual Studio Team System  .......................................................................................................... 49

Podsumowanie ..................................................................................................................................... 53

Rozdział 2. Krótki przegląd środowiska IDE  ..............................................55

Instalacja .............................................................................................................................................. 55

Wybór języka ................................................................................................................................. 55
Instalowanie narzędzi do kontroli kodu źródłowego ..................................................................... 56
Konfigurowanie środowiska programistycznego  .......................................................................... 57

Strona startowa ..................................................................................................................................... 59

Opcje uruchomieniowe .................................................................................................................. 60

Pierwszy projekt ................................................................................................................................... 60
Pasek menu  .......................................................................................................................................... 61
Liczne paski narzędzi ........................................................................................................................... 66

Standardowy pasek narzędzi  ......................................................................................................... 66

Okno narzędzi  ...................................................................................................................................... 68
Graficzne okna projektowe  .................................................................................................................. 69
Edytory tekstu  ...................................................................................................................................... 70

Edytory kodu  ................................................................................................................................. 70
Dostosowywanie edytorów ............................................................................................................ 73

Solution Explorer  ................................................................................................................................. 74
Okno Properties  ................................................................................................................................... 74

background image

6  

Microsoft Visual Studio 2005. Księga eksperta

Zarządzanie wieloma oknami środowiska IDE ....................................................................................75

Przyczepianie .................................................................................................................................75
Dokowanie .....................................................................................................................................76

Podsumowanie ......................................................................................................................................78

Rozdział 3. Rozszerzenia platformy i języków .NET w wersji 2005  ........... 79

Rozszerzenia wspólne dla różnych języków .NET ...............................................................................79

Typy ogólne ....................................................................................................................................80
Typy dopuszczające wartość null....................................................................................................85
Typy (klasy) częściowe...................................................................................................................88
Właściwości z mieszanym poziomem dostępu ...............................................................................89
Wieloznaczne przestrzenie nazw ....................................................................................................89

Rozszerzenia języka Visual Basic .........................................................................................................90

Instrukcja Continue .........................................................................................................................91
Typy bez znaku ...............................................................................................................................91
Operator IsNot.................................................................................................................................91
Blok Using ......................................................................................................................................92
Dostęp do formularzy podobny jak w Visual Basic 6.....................................................................92
Jawne zerowe dolne ograniczenie w tablicach................................................................................92
Przeciążanie operatorów .................................................................................................................93
Niestandardowe zdarzenia ..............................................................................................................93

Rozszerzenia języka C#.........................................................................................................................93

Metody anonimowe.........................................................................................................................94
Klasy statyczne................................................................................................................................95
Używanie dwóch wersji tego samego podzespołu..........................................................................96
Podzespoły zaprzyjaźnione .............................................................................................................97

Rozszerzenia platformy .NET 2.0 .........................................................................................................98

Nowe właściwości w podstawowych technologiach ......................................................................99

Podsumowanie.....................................................................................................................................100

Część II Środowisko Visual Studio 2005 — szczegóły ......................101

Rozdział 4. Rozwiązania i projekty  .......................................................... 103

Wprowadzenie do rozwiązań  .............................................................................................................103

Tworzenie rozwiązania  ................................................................................................................104
Korzystanie z rozwiązań  ..............................................................................................................108

Zapoznawanie się z projektami  ..........................................................................................................113

Tworzenie projektu  ......................................................................................................................113
Używanie plików definicji projektu .............................................................................................116
Praca z projektami ........................................................................................................................121

Podsumowanie ....................................................................................................................................126

Rozdział 5. Przeglądarki i eksploratory  ................................................... 129

Okno Solution Explorer ......................................................................................................................129

Ikony i wskazówki graficzne  .......................................................................................................130
Zarządzanie rozwiązaniami ..........................................................................................................134
Zarządzanie projektami  ................................................................................................................135

Okno Class View ................................................................................................................................135

Pasek narzędzi ..............................................................................................................................135
Pasek wyszukiwania .....................................................................................................................137

background image

  

Spis treści  

7

Panel obiektów  ............................................................................................................................ 137
Panel składowych  ........................................................................................................................ 139

Okno Server Explorer  ........................................................................................................................ 140

Połączenia z danymi  .................................................................................................................... 140
Komponenty serwera  ................................................................................................................... 141

Okno Object Browser  ........................................................................................................................ 145

Zmiana zasięgu  ............................................................................................................................ 145
Przeglądanie obiektów ................................................................................................................. 146

Okno Performance Explorer  .............................................................................................................. 148

Tworzenie sesji wydajności ......................................................................................................... 148
Konfigurowanie sesji  ................................................................................................................... 149
Jednostki docelowe sesji .............................................................................................................. 153
Raporty ........................................................................................................................................ 154
Czytanie raportów dotyczących wydajności  ............................................................................... 154

Okno Macro Explorer  ........................................................................................................................ 160

Węzeł główny — Macros  ............................................................................................................ 161
Projekty ........................................................................................................................................ 161
Moduły ......................................................................................................................................... 162
Makra ........................................................................................................................................... 162

Okno Document Outline  .................................................................................................................... 162

Modyfikowanie elementów  ......................................................................................................... 162

Podsumowanie ................................................................................................................................... 164

Rozdział 6. Wprowadzenie do edytorów i okien projektowych  ...........165

Podstawy ............................................................................................................................................ 165

Edytor tekstu ................................................................................................................................ 166
Okna projektowe środowiska Visual Studio  ............................................................................... 168

Pisanie kodu w edytorze  .................................................................................................................... 168

Otwieranie edytora  ...................................................................................................................... 169
Pisanie kodu ................................................................................................................................. 169
Budowa okna edytora kodu  ......................................................................................................... 171
Narzędzia do nawigowania po kodzie  ......................................................................................... 173
Przeszukiwanie dokumentów  ...................................................................................................... 175
Diagnozowanie w edytorze kodu  ................................................................................................ 183
Drukowanie kodu  ........................................................................................................................ 186
Używanie okna Code Definition  ................................................................................................. 187

Tworzenie i modyfikowanie dokumentów i szablonów XML  .......................................................... 188
Tworzenie aplikacji bazujących na formularzach Windows  ............................................................. 191

Dostosowywanie wyglądu formularza  ........................................................................................ 192
Dodawanie kontrolek do formularza  ........................................................................................... 193
Pisanie kodu ................................................................................................................................. 195

Tworzenie formularzy sieciowych ..................................................................................................... 198

Projektowanie aplikacji bazujących na formularzach sieciowych  .............................................. 199

Tworzenie komponentów i kontrolek  ................................................................................................ 203

Tworzenie nowego komponentu lub kontrolki ............................................................................ 204
Uwagi na temat pisania kodu komponentów ............................................................................... 205

Podsumowanie ................................................................................................................................... 206

background image

8  

Microsoft Visual Studio 2005. Księga eksperta

Rozdział 7. Korzystanie z narzędzi zwiększających produktywność  ... 207

Podstawowe narzędzia pomocnicze edytorów kodu  ..........................................................................209

Śledzenie zmian  ...........................................................................................................................209
Wskazówki dotyczące problemów ...............................................................................................209
Aktywne odnośniki  ......................................................................................................................210
Kolorowanie składni  ....................................................................................................................211

Schematy i nawigacja  .........................................................................................................................212

Schematy kodu  .............................................................................................................................212
Nawigowanie po kodzie HTML ...................................................................................................214

Inteligentne znaczniki i operacje  ........................................................................................................216

Okno projektowe HTML ..............................................................................................................216
Okno projektowe formularzy Windows .......................................................................................217
Edytor kodu ..................................................................................................................................217

Mechanizm IntelliSense  .....................................................................................................................217

Uzupełnianie słów (Complete Word) ...........................................................................................218
Okno z informacjami podręcznymi (Quick Info) .........................................................................219
Okno z listą składowych (List Members)  ....................................................................................220
Okno z informacjami o parametrach (Parameter Info)  ................................................................220
Fragmenty kodu i kod szablonowy  ..............................................................................................221
Dopasowywanie nawiasów  ..........................................................................................................229
Dostosowywanie mechanizmu IntelliSense do własnych potrzeb ...............................................230

Okno Task List  ...................................................................................................................................231

Zadania związane z komentarzami  ..............................................................................................232
Zadania związane ze skrótami  .....................................................................................................233
Zadania użytkownika  ...................................................................................................................234

Podsumowanie ....................................................................................................................................234

Rozdział 8. Refaktoryzacja kodu  ............................................................. 235

Podstawy refaktoryzacji w Visual Studio ...........................................................................................236

Uruchamianie narzędzi do refaktoryzacji  ....................................................................................237
Podgląd zmian ..............................................................................................................................240

Zmienianie nazw  ................................................................................................................................241

Uruchamianie operacji Rename  ...................................................................................................242
Używanie okna dialogowego Rename  .........................................................................................243

Pobieranie metod  ................................................................................................................................244

Uruchamianie refaktoryzacji Extract Method  ..............................................................................244
Pobieranie metod ..........................................................................................................................245
Generowanie szkieletu metody  ....................................................................................................250

Pobieranie interfejsów  ........................................................................................................................250

Uruchamianie refaktoryzacji Extract Interface  ............................................................................250
Pobieranie interfejsów ..................................................................................................................251

Refaktoryzacja parametrów ................................................................................................................253

Usuwanie parametrów ..................................................................................................................253
Przekształcanie zmiennych lokalnych na parametry ....................................................................254
Zmiana kolejności parametrów  ....................................................................................................256

Hermetyzacja pól ................................................................................................................................257

Uruchamianie refaktoryzacji Encapsulate Field  ..........................................................................257
Okno dialogowe Encapsulate Field ..............................................................................................258

Podsumowanie ....................................................................................................................................259

background image

  

Spis treści  

9

Rozdział 9. Diagnozowanie w Visual Studio 2005 ...................................261

Podstawy diagnozowania ................................................................................................................... 261

Scenariusz .................................................................................................................................... 262
Wiele etapów diagnozowania  ...................................................................................................... 262
Diagnozowanie aplikacji (samodzielne sprawdzanie) ................................................................. 263
Podsumowanie podstaw diagnozowania  ..................................................................................... 272

Debuger środowiska Visual Studio .................................................................................................... 272

Menu i pasek narzędzi Debug  ..................................................................................................... 272
Opcje diagnozowania  .................................................................................................................. 276
Wkraczanie w kod, wychodzenie z niego i przeskakiwanie ........................................................ 277
Określanie warunków wstrzymania wykonywania kodu  ............................................................ 282
Korzystanie z punktów śledzenia (When Hit…)  ......................................................................... 289
Podglądanie danych w debugerze ................................................................................................ 291
Korzystanie z funkcji „zmień i kontynuuj”  ................................................................................. 297
Zdalne diagnozowanie  ................................................................................................................. 298

Podsumowanie ................................................................................................................................... 299

Rozdział 10. Obiektowy model automatyzacji środowiska

Visual Studio  .........................................................................301

Przegląd obiektowego modelu automatyzacji  ................................................................................... 302

Wersje modelu obiektowego  ....................................................................................................... 302
Kategorie automatyzacji  .............................................................................................................. 302
Obiekt główny DTE (DTE2)  ....................................................................................................... 304

Obiekty Solution i Project .................................................................................................................. 306

Kontrolowanie projektów wchodzących w skład rozwiązania .................................................... 308
Dostęp do kodu projektu .............................................................................................................. 308

Okna ................................................................................................................................................... 309

Dostęp do okien  ........................................................................................................................... 311
Interakcja z oknami  ..................................................................................................................... 312
Okna tekstowe i panele ................................................................................................................ 315
Rodzaje okien narzędzi ................................................................................................................ 317
Okna połączone  ........................................................................................................................... 325

Paski poleceń  ..................................................................................................................................... 326
Dokumenty ......................................................................................................................................... 330

Dokumenty tekstowe  ................................................................................................................... 330

Obiekty polecenia  .............................................................................................................................. 341

Wykonywanie poleceń  ................................................................................................................ 343
Dodawanie klawiszy skrótu ......................................................................................................... 343

Obiekty debugera  ............................................................................................................................... 344
Zdarzenia automatyzacji  .................................................................................................................... 345
Podsumowanie ................................................................................................................................... 346

Rozdział 11. Tworzenie makr, dodatków i kreatorów  ............................347

Pisanie makr ....................................................................................................................................... 348

Rejestrowanie makr  ..................................................................................................................... 348
Korzystanie z okna Macro Explorer  ............................................................................................ 349
Używanie środowiska IDE Macros  ............................................................................................. 350
Obsługa zdarzeń  .......................................................................................................................... 357
Wywoływanie makr ..................................................................................................................... 363

background image

10  

Microsoft Visual Studio 2005. Księga eksperta

Tworzenie dodatków w Visual Studio  ...............................................................................................366

Zarządzanie dodatkami  ................................................................................................................367
Uruchamianie kreatora dodatków  ................................................................................................368
Struktura dodatków  ......................................................................................................................375
Przykładowy dodatek — paleta do wybierania kolorów  .............................................................383

Tworzenie kreatorów dla środowiska Visual Studio ..........................................................................403

Analiza struktury kreatorów .........................................................................................................403
Tworzenie kreatorów typu Add New Item ...................................................................................406

Podsumowanie ....................................................................................................................................411

Rozdział 12. Społeczność .NET: wykorzystanie

i tworzenie współdzielonego kodu ................................ 413

Możliwości Visual Studio związane ze społecznością .......................................................................413

Strona startowa Visual Studio ......................................................................................................414
Menu Community  ........................................................................................................................419

Wykrywanie i wykorzystanie współdzielonych zasobów ..................................................................430

Rodzaje współdzielonych zasobów ..............................................................................................430
Wyszukiwanie odpowiednich zasobów  .......................................................................................431
Instalowanie i przechowywanie udostępnianych zasobów  ..........................................................431

Własny wkład w społeczność .............................................................................................................433

Tworzenie udostępnianych elementów (szablonów projektów i elementów)  .............................433
Tworzenie szablonów projektów  .................................................................................................433
Tworzenie szablonów elementów  ................................................................................................439
Tworzenie pakietów  .....................................................................................................................440
Udostępnianie własnych rozwiązań  .............................................................................................447

Podsumowanie ....................................................................................................................................448

Część III Visual Studio 2005 w praktyce  ...........................................449

Rozdział 13. Tworzenie interfejsów użytkownika w ASP.NET .................. 451

Podstawy witryn w ASP.NET  ............................................................................................................451

Tworzenie nowego projektu aplikacji sieciowej ..........................................................................452
Kontrolowanie właściwości i opcji projektu ................................................................................460
Tworzenie stron internetowych ....................................................................................................465

Projektowanie interfejsu użytkownika  ...............................................................................................470

Określanie układu strony i położenia kontrolek ...........................................................................470
Tworzenie jednolitego wyglądu i zachowania  .............................................................................472
Tworzenie UI konfigurowanego przez użytkownika  ...................................................................482

Praca z kontrolkami ASP.NET ...........................................................................................................491

Udoskonalenia kontrolek ASP.NET  ............................................................................................491
Nowe kontrolki wewnątrz ASP.NET ...........................................................................................492

Podsumowanie ....................................................................................................................................498

Rozdział 14. Budowanie formularzy Windows  ........................................ 499

Podstawy projektowania formularzy ..................................................................................................499

Uwzględnianie użytkownika końcowego  ....................................................................................500
Rola standardów UI ......................................................................................................................500
Planowanie interfejsu użytkownika  .............................................................................................501

Tworzenie formularza  ........................................................................................................................502

Typ projektu Windows Application .............................................................................................503
Właściwości i zdarzenia formularza  ............................................................................................504

background image

  

Spis treści  

11

Dodawanie kontrolek i komponentów  ............................................................................................... 506

Układ i pozycjonowanie kontrolek .............................................................................................. 507
Używanie kontenerów  ................................................................................................................. 511
Wygląd i zachowanie kontrolek  .................................................................................................. 515
Praca z kontrolkami ToolStrip ..................................................................................................... 516
Wyświetlanie danych ................................................................................................................... 523

Tworzenie własnych kontrolek  .......................................................................................................... 527

Dziedziczenie z istniejącej kontrolki  ........................................................................................... 527
Definiowanie kontrolki użytkownika  .......................................................................................... 528
Tworzenie własnej kontrolki  ....................................................................................................... 531

Podsumowanie ................................................................................................................................... 531

Rozdział 15. Praca z bazami danych  ......................................................533

Tworzenie tabel i związków  .............................................................................................................. 533

Tworzenie nowej bazy danych SQL Server  ................................................................................ 534
Definiowanie tabel ....................................................................................................................... 535
Korzystanie z Database Diagram Designer  ................................................................................. 537

Praca z poleceniami SQL ................................................................................................................... 541

Pisanie zapytań  ............................................................................................................................ 541
Tworzenie widoków  .................................................................................................................... 545
Programowanie procedur składowanych ..................................................................................... 545
Tworzenie wyzwalaczy  ............................................................................................................... 549
Tworzenie funkcji definiowanych przez użytkownika ................................................................ 549

Korzystanie z projektów bazy danych  ............................................................................................... 551

Tworzenie projektu bazy danych ................................................................................................. 551
Automatyczne generowanie skryptów ......................................................................................... 552
Wykonywanie skryptu  ................................................................................................................. 553

Tworzenie obiektów bazy danych w kodzie zarządzanym ................................................................ 554

Rozpoczynanie projektu SQL Server  .......................................................................................... 554
Tworzenie procedury składowanej w C#  .................................................................................... 555

Wiązanie kontrolek z danymi  ............................................................................................................ 557

Wprowadzenie do wiązania danych  ............................................................................................ 557
Automatyczne generowanie związanych kontrolek Windows Forms ......................................... 559
Ręczne wiązanie kontrolek formularzy Windows ....................................................................... 564
Wiązanie danych z kontrolkami sieciowymi ............................................................................... 568

Podsumowanie ................................................................................................................................... 572

Rozdział 16. Usługi sieciowe i Visual Studio  ............................................573

Definicja usług sieciowych  ................................................................................................................ 574

Terminy dotyczące usług sieciowych .......................................................................................... 574

Komponenty projektu usługi sieciowej  ............................................................................................. 575

Usługi sieciowe .NET .................................................................................................................. 575
Projekt ASP.NET Web Service  ................................................................................................... 576
Pliki usługi sieciowej ................................................................................................................... 577

Programowanie usługi sieciowej  ....................................................................................................... 578

Tworzenie usługi sieciowej  ......................................................................................................... 578
Dostęp i wywoływanie usługi sieciowej  ..................................................................................... 582

Konsumowanie usługi sieciowej ........................................................................................................ 588

Definiowanie referencji sieciowej  ............................................................................................... 588
Wyświetlanie referencji sieciowej ............................................................................................... 590
Wywoływanie usługi sieciowej  ................................................................................................... 590

background image

12  

Microsoft Visual Studio 2005. Księga eksperta

Zarządzanie wyjątkami usług sieciowych  ..........................................................................................592

Tworzenie wyjątku usługi sieciowej ............................................................................................592
Obsługa wyjątków usług sieciowych  ...........................................................................................593

Podsumowanie ....................................................................................................................................593

Część IV Visual Studio 2005 Team System ........................................595

Rozdział 17. Praca zespołowa i Visual Studio Team System  ................. 597

Przegląd projektów tworzenia oprogramowania  ................................................................................597

MSF Agile ....................................................................................................................................598
MSF dla CMMI ............................................................................................................................600

Wprowadzenie do Visual Studio Team System  .................................................................................601

Visual Studio Team Architect ......................................................................................................603
Visual Studio Team Developer  ....................................................................................................603
Visual Studio Team Test ..............................................................................................................605
Team Foundation Server  ..............................................................................................................606

Podsumowanie ....................................................................................................................................608

Rozdział 18. Zarządzanie i praca z projektami zespołowymi  ............... 611

Anatomia Team Foundation Server ....................................................................................................611

Warstwa aplikacji .........................................................................................................................612
Warstwa danych  ...........................................................................................................................614
Bezpieczeństwo ............................................................................................................................615

Zarządzanie projektem zespołowym  ..................................................................................................617

Tworzenie nowego projektu zespołowego ...................................................................................618
Dodawanie użytkowników do zespołu projektu  ..........................................................................621
Kontrolowanie struktury projektu i iteracji ..................................................................................626

Przyłączanie się do zespołu projektowego  .........................................................................................628

Łączenie się z Team Foundation Server  ......................................................................................628
Korzystanie z Team Explorer .......................................................................................................629
Korzystanie z portalu projektu  .....................................................................................................629
Korzystanie z Microsoft Office ....................................................................................................631
Korzystanie z alarmów projektu  ..................................................................................................633
Praca z raportami projektu  ...........................................................................................................634

Podsumowanie ....................................................................................................................................636

Rozdział 19. Kontrola kodu źródłowego  ................................................. 637

Podstawy systemu kontroli kodu źródłowego serwera Team Foundation  .........................................638

Podstawowa architektura  .............................................................................................................638
Uprawnienia w systemie zabezpieczeń  ........................................................................................639

Pierwsze kroki w korzystaniu z kontroli kodu źródłowego serwera Team Foundation ......................640

Konfigurowanie środowiska Visual Studio  .................................................................................641
Używanie okna Source Control Explorer  ....................................................................................642
Zarządzanie obszarami roboczymi ...............................................................................................644
Dodawanie plików do systemu kontroli kodu źródłowego ..........................................................647

Modyfikowanie plików objętych kontrolą kodu źródłowego  ............................................................648

Pobieranie plików z repozytorium kodu źródłowego  ..................................................................648
Przesyłanie zmian .........................................................................................................................649
Wprowadzenie do zbiorów zmian ................................................................................................654
Odkładanie kodu  ..........................................................................................................................655
Scalanie zmian  .............................................................................................................................656

background image

  

Spis treści  

13

Rozgałęzianie i scalanie  ..................................................................................................................... 659

Rozgałęzianie ............................................................................................................................... 660
Scalanie ........................................................................................................................................ 661

Podsumowanie ................................................................................................................................... 662

Rozdział 20. Śledzenie elementów roboczych .......................................663

Wprowadzenie do elementów roboczych  ......................................................................................... 664

Funkcje elementów roboczych i SDLC ....................................................................................... 664
Wybieranie zestawu elementów roboczych dla własnego projektu  ............................................ 664
Identyfikowanie wspólnych cech elementów roboczych  ............................................................ 669

Zarządzanie elementami roboczymi za pomocą narzędzi Team Explorer  ........................................ 678
Wprowadzenie do ról zespołowych  ................................................................................................... 684

Wizja projektu  ............................................................................................................................. 684
Menedżer projektu  ....................................................................................................................... 685
Analityk biznesowy  ..................................................................................................................... 692
Programista .................................................................................................................................. 694
Tester ........................................................................................................................................... 698

Dostosowywanie elementów roboczych do własnych potrzeb .......................................................... 699

Umieszczanie w procesie elementów roboczych  ........................................................................ 700
Dostosowywanie istniejących elementów roboczych  ................................................................. 705

Podsumowanie ................................................................................................................................... 707

Rozdział 21. Modelowanie  .......................................................................709

Elementy Team Architect  .................................................................................................................. 710

Szablony projektów  ..................................................................................................................... 710
Szablony elementów .................................................................................................................... 711

Projektowanie aplikacji ...................................................................................................................... 711

Korzystanie ze schematów aplikacji ............................................................................................ 712

Definiowanie systemów ..................................................................................................................... 720

Schemat systemu  ......................................................................................................................... 720

Definiowanie infrastruktury ............................................................................................................... 722

Schemat logicznego centrum danych  .......................................................................................... 723

Wdrażanie aplikacji  ........................................................................................................................... 731

Schemat wdrażania  ...................................................................................................................... 732
Sprawdzanie poprawności wdrożenia  ......................................................................................... 733
Raport dotyczący wdrożenia  ....................................................................................................... 733

Implementowanie aplikacji  ................................................................................................................ 735

Ustawianie właściwości implementacji ....................................................................................... 735
Generowanie projektów ............................................................................................................... 736

Graficzne tworzenie kodu  .................................................................................................................. 736

Schematy klasy  ............................................................................................................................ 737
Dodawanie elementów  ................................................................................................................ 738
Definiowanie relacji między klasami  .......................................................................................... 739
Definiowanie metod, właściwości, pól i zdarzeń  ........................................................................ 742

Podsumowanie ................................................................................................................................... 743

Rozdział 22. Testowanie ............................................................................745

Tworzenie i konfigurowanie testów oraz zarządzanie nimi  .............................................................. 746

Projekty testów  ............................................................................................................................ 746
Elementy testów  .......................................................................................................................... 748

background image

14  

Microsoft Visual Studio 2005. Księga eksperta

Menedżer testów  ..........................................................................................................................749
Konfigurowanie testów  ................................................................................................................750

Testy programistów  ............................................................................................................................751

Przykładowy test jednostki  ..........................................................................................................751
Pisanie efektywnych testów jednostek .........................................................................................752
Używanie klas i metod testów jednostek  .....................................................................................753
Tworzenie testów jednostek .........................................................................................................754
Uruchamianie testów jednostek  ...................................................................................................755
Analiza pokrycia kodu  .................................................................................................................757

Testy sieciowe  ....................................................................................................................................759

Rejestrowanie testów sieciowych  ................................................................................................759
Zarządzanie żądaniami w testach aplikacji sieciowych  ...............................................................761
Uruchamianie testów sieciowych i przeglądanie wyników  .........................................................762
Dodawanie danych do testów sieciowych ....................................................................................762
Pobieranie wartości z testów sieciowych  .....................................................................................768
Zasady sprawdzania poprawności w żądaniach  ...........................................................................769

Testy obciążenia  .................................................................................................................................771

Tworzenie testów obciążenia  .......................................................................................................772
Przeglądanie i modyfikowanie testów obciążenia  .......................................................................777
Uruchamianie testów obciążenia i wyświetlanie wyników  .........................................................778

Ręczne testy ........................................................................................................................................779

Tworzenie testów ręcznych ..........................................................................................................779
Wykonywanie testów ręcznych ....................................................................................................779

Testy ogólne  .......................................................................................................................................780
Testy uporządkowane .........................................................................................................................782

Tworzenie testów uporządkowanych  ...........................................................................................782

Podsumowanie ....................................................................................................................................783

Rozdział 23. Team Foundation Build ........................................................ 785

Przegląd Team Foundation Build .......................................................................................................785

Architektura Team Foundation Build  ..........................................................................................786

Tworzenie nowej wersji  .....................................................................................................................789

Określanie informacji o nowej wersji  ..........................................................................................789
Modyfikowanie typu wersji  .........................................................................................................793
Funkcje MSBuild  .........................................................................................................................797

Uruchamianie budowania ...................................................................................................................798

Szeregowanie wersji .....................................................................................................................798
Wywoływanie procesu budowania  ..............................................................................................799

Monitorowanie i analizowanie wersji  ................................................................................................800

Wprowadzenie do przeglądarki Team Build Browser  .................................................................800
Raporty dotyczące wersji  .............................................................................................................803

Podsumowanie ....................................................................................................................................804

Skorowidz ................................................................................................... 805

background image

Rozdział 3.

Rozszerzenia platformy

i języków .NET w wersji 2005

Większa część niniejszej książki dotyczy głównie narzędzi IDE Visual Studio służących
poprawie produktywności. Uważamy jednak, że warto zapoznać się także z nowinkami
w językach .NET i samej platformie. Te elementy (IDE, języki i platforma) są udostęp-
niane przez Microsoft w jednym pakiecie. Z tego powodu wszelkie opisy dotyczące IDE
byłyby niepełne bez wzmianki o pozostałych produktach.

W rozdziale opisano nowinki w językach Visual Basic .NET i C#. Opisujemy także nie-
które z kluczowych poprawek w samej platformie. Zakładamy, że większość Czytelników
ma przynajmniej podstawową wiedzę na temat albo Visual Basic, albo któregoś ze starszych
języków bazujących na C, a także w miarę dobrze zna platformę .NET. Dlatego kon-
centrujemy się głównie na tych rozszerzeniach, dzięki którym .NET 2.0 stanowi krok
naprzód w porównaniu z poprzednimi wersjami.

Rozszerzenia wspólne

dla różnych języków .NET

Języki z rodziny .NET otrzymały sporo rozszerzeń w wyniku poprawek wprowadzonych
we wspólnym środowisku uruchomieniowym (ang. Common Language Runtime — CLR).
Choć niektóre z rozszerzeń są specyficzne dla poszczególnych języków, liczne istotne
usprawnienia w wersji 2005 dotyczą ich obu. Dlatego przedstawiamy je wspólnie wraz
z przykładowym kodem w obu tych językach. Ta grupa rozszerzeń języków .NET obej-
muje następujące kluczowe usprawnienia:

 

Typy ogólne.

 

Typy dopuszczające wartość "null".

 

Typy częściowe.

 

Właściwości o mieszanym poziomie dostępu.

 

Wieloznaczne przestrzenie nazw.

background image

80

Część I 

 Wprowadzenie do Visual Studio 2005 i .NET

W następnych punktach szczegółowo opisujemy każdy z tych elementów. Przedstawiamy
przykłady w językach C# i Visual Basic, ponieważ powyższe nowinki dotyczą ich obu.
Rozszerzenia specyficzne dla każdego z tych języków opisane są w dalszej części rozdziału.

Typy ogólne

Typy ogólne (ang. generics) to bez wątpienia najważniejsza nowość w .NET 2.0, dlatego
żadna książka opisująca tę platformę nie byłaby kompletna bez opisu ich działania. Ty-
py ogólne początkowo mogą się wydawać skomplikowane, szczególnie jeśli zaczniesz
analizować kod zawierający dziwne nawiasy ostre w przypadku języka C# czy słowo
kluczowe 

Of

 w Visual Basic. Poniższe podpunkty zawierają definicję typów ogólnych,

wyjaśniają ich znaczenie oraz pokazują, jak używać ich w kodzie.

Definicja typów ogólnych

Działanie  typów ogólnych jest stosunkowo proste. Czasem trzeba utworzyć obiekt (lub
zdefiniować parametr metody), jednak na etapie pisania kodu nie wiadomo, jakiego typu
będzie ten obiekt. Typ powinien być ogólny i umożliwiać osobie korzystającej z niego
określenie faktycznego typu obiektu.

Do rozwiązania tego problemu można użyć klasy 

System.Object

 — tak postępowali

programiści używający wersji starszych od 2.0. Jednak wyobraź sobie, że chcesz uniknąć
konieczności pakowania typów, sprawdzania ich w czasie wykonywania programu i jaw-
nego rzutowania w wielu miejscach kodu. Pozwala to zrozumieć, do czego mogą służyć
typy ogólne.

Zalety stosowania typów ogólnych najlepiej pokazać na przykładzie. Najprostszy to two-
rzenie klasy kolekcji zawierającej inne obiekty. Wyobraź sobie, że chcesz zapisać grupę
obiektów. Można to zrobić, dodając je do kolekcji 

ArrayList

. Jednak kompilator i środo-

wisko uruchomieniowe mają informacje jedynie o tym, że przechowywana jest lista ja-
kichś obiektów. Może ona zawierać obiekty typu 

Order

Customer

 lub obu tych typów

(lub dowolnych innych). Jedyny sposób, aby dowiedzieć się, co przechowuje lista, to
napisać kod sprawdzający typ przechowywanych obiektów.

Oczywiście można obejść ten problem i napisać własną silnie typowaną listę. Choć takie
rozwiązanie jest możliwe, wymaga to żmudnego pisania niemal takiego samego kodu dla
każdego typu, który ma być przechowywany w kolekcji. Jedyną istotną różnicą w kodzie
jest typ obiektów, jakie lista może przechowywać. Ponadto wciąż trzeba rzutować obiekty,
ponieważ używana lista zawiera obiekty typu 

System.Object

.

Teraz wyobraź sobie, że możesz napisać klasę, która umożliwia użytkownikom definio-
wanie typu. Można napisać jedną ogólną klasę listy, która zamiast zawierać obiekty typu

System.Object

, będzie zawierała obiekty typu użytego w miejscu definiowania tej klasy.

Umożliwia to określenie w kodzie wywołującym ogólną listę tego, czy na przykład ma
ona przechowywać obiekty typu 

Order

 lub 

Customer

. Właśnie to umożliwiają typy ogólne.

Można myśleć o klasach ogólnych jako o szablonach klas.

background image

Rozdział 3. 

 Rozszerzenia platformy i języków .NET w wersji 2005

81

Są dwa rodzaje elementów ogólnych: typy ogólne i metody ogólne. Typy ogólne to klasy,
których typ jest definiowany w miejscu tworzenia egzemplarza danej klasy. Metoda ogólna
ma przynajmniej jeden parametr o typie ogólnym. W tym przypadku w metodzie używany
jest ogólny parametr, ale jego typ jest określany dopiero w momencie wywołania metody.
Ponadto można zdefiniować różne ograniczenia związane z tworzeniem typów ogólnych.
W następnych podpunktach przedstawimy różne związane z nimi zagadnienia.

Zalety stosowania typów ogólnych

Teraz jasno widać niektóre z zalet stosowania typów ogólnych. Bez takich typów klasy
mające zarządzać różnymi typami muszą używać typu 

System.Object

. Powoduje to

liczne problemy. Po pierwsze, nie ma możliwości nałożenia ograniczeń ani sprawdzenia
przez kompilator, co jest zapisywane w obiekcie. Istotne są wynikające z tego wnioski
— nie wiadomo, co znajduje się w kolekcji, jeśli nie można ograniczyć typu zapisywanych
w niej obiektów. Po drugie, używając obiektu, trzeba sprawdzić jego typ, a następnie zrzu-
tować z powrotem na oryginalny typ. Oczywiście powoduje to spadek wydajności. Po-
nadto jeśli programista używa typów skalarnych i zapisuje je w obiektach 

System.Object

,

typy są pakowane. W momencie pobierania typu skalarnego trzeba go rozpakować. Także
to wymaga zbędnego kodu i niepotrzebnie pogarsza wydajność. Typy ogólne rozwiązują
wszystkie te problemy. Poniżej opisujemy, jak jest to możliwe.

W jaki sposób .NET obsługuje typy ogólne?

Kompilacja typu ogólnego, podobnie jak pozostałego kodu dla platformy .NET, powoduje
utworzenie kodu w języku pośrednim Microsoftu (ang. Microsoft Intermediate Language
— MSIL) oraz metadanych. Oczywiście w przypadku typów i metod ogólnych kompi-
lator generuje kod MSIL definiujący sposób ich stosowania.

Kiedy kod MSIL jest wykonywany po raz pierwszy, kompilator JIT (ang. just-in-time)
kompiluje go do kodu natywnego. Kiedy taki kompilator natrafi na typ ogólny, „wie”, że
w jego miejsce należy wstawić typ rzeczywisty i robi to. Ten proces nazywany jest two-
rzeniem egzemplarza typu ogólnego.

W następnych wywołaniach używany jest świeżo skompilowany typ kodu natywnego.
W rzeczywistości wszystkie typy referencyjne mogą współdzielić jeden egzemplarz typu
ogólnego, ponieważ w kodzie natywnym te referencje to po prostu wskaźniki na ten sam
obiekt. Oczywiście jeśli w procesie tworzenia egzemplarza typu ogólnego używany jest no-
wy typ skalarny, środowisko uruchomieniowe „w locie” utworzy nową kopię tego typu
ogólnego.

Dlatego korzystanie z typów ogólnych niesie zalety zarówno na etapie pisania kodu,
jak i w czasie jego wykonywania. W czasie wykonywania cały oryginalny kod jest prze-
kształcany na natywny, silnie typowany kod. Przyjrzyjmy się teraz, jak tworzyć typy ogólne.

background image

82

Część I 

 Wprowadzenie do Visual Studio 2005 i .NET

Tworzenie typów ogólnych

Typy ogólne to klasy zawierające przynajmniej jeden element, którego typ należy określić
w czasie tworzenia obiektu (a nie na etapie tworzenia klasy). Aby zdefiniować typ
ogólny, należy najpierw zadeklarować klasę, a następnie zdefiniować dla niej parametry
typu.  Parametr typu jest przekazywany do klasy w celu zdefiniowania rzeczywistego
typu dla typu ogólnego. Parametry typu działają podobnie do parametrów metod. Istotna
różnica polega na tym, że zamiast wartości lub referencji do obiektu przekazywany jest
typ używany w typie ogólnym.

Większość typów ogólnych służy do zarządzania kolekcjami obiektów lub listami
wiązanymi. Nie jest to jednak jedyne zastosowanie tych typów. Dowolna klasa
może być typem ogólnym.

Załóżmy, że programista chce napisać klasę 

Fields

, która obsługuje pary nazwa-wartość,

podobnie jak robią to kolekcje 

Hashtable

 czy 

Dictionary

. Można zadeklarować tę klasę

w następujący sposób:

C#:

public class Fields

VB:

Public Class Fields

Załóżmy ponadto, że ta klasa może używać różnych typów jako kluczy i wartości. Klasa
ma w ogólny sposób obsługiwać wiele typów, jednak po utworzeniu jej egzemplarza
należy je ograniczyć do tych, które zostały określone w procesie tworzenia tego egzem-
plarza. Aby dodać parametry typu do deklaracji klasy, należy użyć następującej składni:

C#:

public class Fields<keyType, valueType>

VB:

Public Class Fields(Of keyType, valueType)

W tym przypadku 

keyType

 i 

valueType

 to parametry typu, których można używać w resz-

cie kodu klasy zamiast typów, które zostaną określone w czasie tworzenia jej egzemplarza.
Można na przykład dodać do klasy metodę 

Add

, której sygnatura wygląda tak:

C#:

public void Add(keyType key, valueType value)

VB:

Public Sub Add(key as keyType, value as valueType)

Stanowi to informację dla kompilatora o tym, że typu użytego do utworzenia klasy należy
także używać w tej metodzie. Aby korzystać z klasy, w kodzie trzeba najpierw utworzyć
jej egzemplarz i przekazać do niego argumenty typu. Argumenty typu to typy przekazy-
wane jako parametry typu, takie jak w poniższym kodzie:

background image

Rozdział 3. 

 Rozszerzenia platformy i języków .NET w wersji 2005

83

C#:

Fields<int, Field> myFields = new Fields<int, Field>();

VB:

Dim myFields As New Fields(Of Integer, Field)

W tym przypadku nowy egzemplarz ogólnej klasy 

Field

 musi zawiera liczbę typu 

int

(

Integer

) jako klucz i obiekt typu 

Field

 jako wartość. Wywołanie metody 

Add

 świeżo

utworzonego obiektu 

Field

 wygląda teraz tak:

C#:

myFields.Add(1, new Field());

VB:

myFields.Add(1, New Field())

Próba przekazania parametru innego typu wywoła błąd kompilacji, ponieważ wymagany
jest obiekt określonego typu.

Kiedy stosuje się typy ogólne, często do definiowania nazw typów używa się
pojedynczych liter (szczególnie widoczne jest to w języku C#). Nierzadko można
zobaczyć zapis typu 

<T> lub <K>. Nie trzeba ograniczać się do stosowania takich

krótkich nazw. Zawsze lepiej jest używać nieco bardziej opisowego zapisu.

Tworzenie metod ogólnych

Przedstawiliśmy już parametry typów ogólnych. Te parametry typu definiują zmienne
o zasięgu klasy. Oznacza to, że zmienna definiująca typ ogólny jest dostępna w całej kla-
sie. Podobnie jak w przypadku każdej innej klasy, nie trzeba używać zmiennych o zasięgu
całej klasy. Czasem wystarczy zdefiniować elementy przekazywane do danej metody.
Elementy ogólne działają zawsze tak samo. Można zdefiniować je na poziomie klasy (co
już pokazaliśmy) lub na poziomie metody (co pokażemy wkrótce).

Metody ogólne dobrze nadają się do obsługi często używanych funkcji narzędziowych,
które wykonują operacje na różnych typach. Metody ogólne definiuje się poprzez określenie
przynajmniej jednego typu ogólnego po nazwie metody. Następnie można używać tych ty-
pów ogólnych na liście parametrów metody jako zwracanego typu oraz oczywiście w ciele
metody. Poniżej przedstawiona jest składnia służąca do definiowania metod ogólnych:

C#:

public void Save<instanceType>(instanceType type)

VB:

Public Sub Save(Of instanceType)(ByVal type As instanceType)

Aby wywołać tę ogólną metodę, trzeba zdefiniować w jej wywołaniu typ przekazywany
do metody. Załóżmy, że metoda 

Save

 zdefiniowana w poprzednim fragmencie kodu

background image

84

Część I 

 Wprowadzenie do Visual Studio 2005 i .NET

znajduje się w klasie 

Field

, a programista utworzył egzemplarz tej klasy i zapisał referen-

cję do niego w zmiennej 

myField

. Poniższy kod przedstawia, jak można wywołać metodę

Save

, przekazując typ argumentu:

C#:

myField.Save<CustomerOrder>(new CustomerOrder());

VB:

myField.Save(Of CustomerOrder)(New CustomerOrder())

Warto pamiętać o kilku sprawach związanych z metodami ogólnymi. Po pierwsze, często
można pominąć parametr typu w miejscu wywołania metody ogólnej. Kompilator po-
trafi wykryć ten typ na podstawie przekazanych parametrów, dlatego parametr typu jest
opcjonalny. Jednak zwykle warto go określić, ponieważ dzięki temu kod jest bardziej
czytelny, a kompilator nie musi sprawdzać typu. Po drugie, metody ogólne można dekla-
rować jako statyczne (lub współdzielone). Po trzecie, można zdefiniować ograniczenia
dla metod (i klas) ogólnych, co opisano w następnym podpunkcie.

Specyficzne typy ogólne (ograniczenia)

Przy pierwszym napotkaniu metod ogólnych łatwo myśleć o nich jako o prostych narzę-
dziach ułatwiających przechowywanie danych. Na pierwszy rzut oka wydaje się, że cała
ta technika ma poważną wadę. Najlepiej można ją przedstawić za pomocą pytań, które
przychodzą do głowy: „Typy ogólne są świetne, ale co zrobić, jeśli chcemy wywołać
metodę lub właściwość ogólnego obiektu, którego typ jest z definicji nieznany?”. Ta
wada wydaje się ograniczać przydatność typów ogólnych. Jednak po dalszym zastanowieniu
się można zauważyć, że ograniczenia typów ogólnych pozwalają rozwiązać ten problem.

Ograniczenia typów ogólnych działają tak, jak wskazuje na to ich nazwa — pozwalają
zdefiniować ograniczenia dotyczące typów, których nadawca może używać do tworzenia
egzemplarza klasy ogólnej lub wywoływania jednej z metod ogólnych. Ograniczenia
typów ogólnych mają trzy odmiany:

 

Ograniczenia dotyczące dziedziczenia — pozwalają określić, że typ ogólny
musi implementować określone interfejsy lub dziedziczyć po danej klasie bazowej.

 

Ograniczenia dotyczące konstruktora domyślnego — pozwalają określić,
że typ ogólny musi udostępniać konstruktor bezargumentowy.

 

Ograniczenia dotyczące typu (referencyjne lub skalarne) — pozwalają
określić, że parametr typu musi być albo typem referencyjnym, albo skalarnym.

Używanie ograniczenia dotyczącego dziedziczenia umożliwia określenie jednego lub
kilku interfejsów (lub typów obiektu), które można przekazywać do klasy ogólnej. To po-
zwala rozwiązać opisany wcześniej problem. Jeśli zdefiniowana wcześniej ogólna klasa

Fields

 ma umożliwiać wywoływanie metody lub właściwości ogólnego typu 

valueType

(na przykład właściwości ułatwiającej sortowanie grup obiektów typu 

Fields

), można

to wymusić, o ile dana metoda lub właściwość jest zdefiniowana w interfejsie lub klasie
bazowej określonej w ograniczeniu. Poniższy kod pokazuje, jak zdefiniować ograniczenie
dotyczące dziedziczenia:

background image

Rozdział 3. 

 Rozszerzenia platformy i języków .NET w wersji 2005

85

Ograniczenie klasy w C#:

public class Field<keyType, valueType> where keyType : ISort

Ograniczenie klasy w VB:

Public Class Fields(Of keyType, valueType As ISort)

W powyższym kodzie klasa 

Fields

 zawiera definicje dwóch typów ogólnych, 

valueType

keyType

, oraz ma ograniczenie związane z parametrem 

keyType

. To ograniczenie polega

na tym, że 

keyType

 musi implementować interfejs 

ISort

. Umożliwia to używanie metod

tego interfejsu w klasie 

Fields

 bez konieczności rzutowania.

Ograniczenia dotyczące dziedziczenia można definiować dla klas i metod ogólnych.

Można określić dowolną liczbę interfejsów, które typ ogólny ma implementować, ale
tylko jedną klasę bazową, po której ma dziedziczyć. Oczywiście można przekazać jako
typ ogólny obiekt, który dziedziczy po klasie bazowej określonej jako ograniczenie.

Jeśli programista przesłoni ogólną metodę w klasie bazowej, nie może dodać
(ani usunąć) ograniczenia z ogólnej metody. Uwzględniane są jedynie ograniczenia
zdefiniowane w klasie bazowej.

Przestrzeń nazw z kolekcjami ogólnymi

Wiesz już, jak utworzyć własną klasę ogólną. Platforma .NET udostępnia liczne klasy ogól-
ne, których można używać w aplikacjach. Przestrzeń nazw 

System.Collections.Generics

definiuje liczne ogólne klasy kolekcji, które są zaprojektowane tak, aby współpracowały
z grupami obiektów określonego typu. Kolekcja ogólna to klasa kolekcji, która umożliwia
programiście określenie typu przechowywanego w kolekcji w miejscu jej deklaracji.

Visual Studio domyślnie dodaje referencję do przestrzeni nazw 

System.Collections.

åGenerics do wszystkich plików z kodem języków Visual Basic i C#.

Klasy ogólne zdefiniowane w tej przestrzeni nazw różnią się zastosowaniami. Klasa

List

 służy do obsługi prostych list i tablic obiektów. Dostępne są także klasy 

SortedList

,

LinkedList

Queue

Stack

 i kilka klas 

Dictionary

. Dzięki tym klasom można korzystać

z wszystkich podstawowych operacji bez konieczności używania typizowanych klas
kolekcji. Ponadto w tej przestrzeni nazw zdefiniowanych jest wiele interfejsów, których
można używać do tworzenia własnych kolekcji ogólnych.

Typy dopuszczające wartość null

Większość programistów od czasu do czasu musi utworzyć w aplikacji zmienną i określić
jej domyślną wartość, zanim jeszcze wiadomo, jaką wartość ta zmienna powinna zawierać.
Wyobraź sobie, że programista utworzył klasę 

Osoba

 ze zmienną logiczną 

JestKobieta

.

Jeśli na etapie tworzenia egzemplarza nie wiadomo, jaka jest płeć osoby, trzeba wybrać
domyślną wartość lub zaimplementować tę właściwość jako trójstanowe wyliczenie o war-
tościach 

Mezczyzna

Kobieta

 i 

Nieznana

.

background image

86

Część I 

 Wprowadzenie do Visual Studio 2005 i .NET

To ostatnie rozwiązanie może być niewygodne, szczególnie jeśli w bazie danych wartość
jest przechowywana jako zmienna logiczna. Można wymyślić podobne sytuacje. Wyobraź
sobie, że w programie znajduje się klasa 

Test

 zawierająca zmienną całkowitoliczbową

Ocena

. Jeśli nie wiadomo, jaka jest wartość tej zmiennej, jest ona inicjowana liczbą zero (0).

Ta wartość oczywiście nie reprezentuje rzeczywistej oceny. Następnie trzeba uwzględnić
ten fakt albo traktując zero jako magiczną liczbę, albo używając następnej zmiennej, na
przykład 

OcenaJestUstawiona

.

Ten problem jest tym większy, że wszystkie współczesne bazy danych uwzględniają warto-
ści 

null

 (lub nieustawione). Często nie można użyć tej właściwości bez napisania dodat-

kowego kodu, który przekształca wartości w czasie transakcji wstawiania i pobierania
danych.

Typy dopuszczające wartość 

null

 w .NET 2.0 mają rozwiązać ten problem. Typ dopusz-

czający wartość 

null

 to specjalny typ skalarny, który może mieć wartość 

null

. Inaczej

działają standardowe typy skalarne (

int

bool

double

 i tak dalej), które po prostu nie są

inicjowane w momencie deklarowania. Z kolei dzięki typom dopuszczającym wartość

null

 można tworzyć liczby całkowite, wartości logiczne, liczby zmiennoprzecinkowe

o podwójnej precyzji i inne, a następnie przypisać do nich wartość 

null

. Nie trzeba już

zgadywać, czy zmienna została ustawiona (lub używać do tego specjalnego kodu). Zwal-
nia to też programistę z konieczności określania wartości domyślnej. W zamian można
zainicjować zmienną wartością 

null

 lub przypisać ją do zmiennej. Dzięki temu można

pisać kod bez domyślnych założeń. Ponadto typy dopuszczające wartość 

null

 rozwiązują

problem pobierania wartości 

null

 z bazy danych i umieszczania ich w niej. Przyjrzymy

się teraz, jak działają te typy.

Deklarowanie typów dopuszczających wartość null

Deklarowanie typów dopuszczających wartość 

null

 znacznie różni się między językami

C# i Visual Basic. Jednak w obu przypadkach deklarowana jest ta sama struktura typu
dopuszczającego wartość 

null

 platformy .NET (

System.Nullable

). Ta ogólna struktura

jest zdefiniowana przez typ używany w jej deklaracji. Na przykład jeśli programista defi-
niuje liczbę całkowitą dopuszczającą wartość 

null

, ta ogólna struktura zwraca wersję liczby

całkowitej. Poniższe fragmenty kodu demonstrują, w jaki sposób typy dopuszczające
wartość 

null

 są deklarowane w językach C# i VB:

Typ dopuszczający wartość 

null

 w C#:

bool? hasChildren = null;

Typ dopuszczający wartość 

null

 w VB:

Dim hasChildren As Nullable(Of Boolean) = Nothing

Warto zauważyć, że w kodzie języka C# można użyć modyfikatora typu 

?

 do wskazania,

że typ bazowy należy traktować jako typ dopuszczający wartość 

null

. Jest to po prostu

skrót. Pozwala to programistom używać standardowej składni tworzenia typów i dodać
znak zapytania, żeby przekształcić dany typ na dopuszczający wartość 

null

. Z drugiej strony

w języku Visual Basic trzeba bardziej bezpośrednio zdefiniować klasę 

Nullable

, używając

background image

Rozdział 3. 

 Rozszerzenia platformy i języków .NET w wersji 2005

87

składni podobnej do typów ogólnych. Można także użyć podobnej składni w języku C#,
tak jak w poniższym przykładzie:

System.Nullable<bool> hasChildren = null;

Jedynie typy skalarne mogą dopuszczać wartość 

null. Dlatego nie jest poprawne

tworzenie dopuszczających wartość 

null łańcuchów znaków czy egzemplarzy klas

zdefiniowanych przez użytkownika. Można jednak tworzyć dopuszczające wartość
null egzemplarze struktur, ponieważ są one typami skalarnymi.

Używanie typów dopuszczających wartość null

Ogólna struktura 

System.Nullable

 zawiera dwie właściwości służące tylko do odczytu:

HasValue

 i 

Value

. Te właściwości umożliwiają wydajne korzystanie z typów dopuszczają-

cych wartość 

null

. Właściwość 

HasValue

 to wartość logiczna, która określa, czy dany typ

dopuszczający wartość 

null

 ma nadaną wartość. Można użyć tej właściwości w instrukcji

If

, aby określić, czy do danej zmiennej została już przypisana wartość. Ponadto można

po prostu sprawdzić, czy zmienna ma wartość 

null

 (jedynie w C#). Poniżej przedstawiony

jest przykładowy kod:

HasValue

 w C#:

if (hasChildren.HasValue) {...}

HasValue

 w VB:

If hasChildren.HasValue Then

Sprawdzanie zmiennej w C# ze względu na wartość 

null

:

if (hasChildren != null) {...}

Sprawdzanie zmiennej w VB ze względu na wartość 

null

:

If hasChildren.Value <> Nothing Then

Właściwość 

Value

 zwraca wartość zawartą w strukturze dopuszczającej wartość 

null

.

Wciąż można uzyskać dostęp do wartości tej zmiennej, wywołując ją bezpośrednio (bez
używania właściwości 

Value

). Różnica polega na tym, że kiedy właściwość 

HasValue

ma wartość 

false

, próba wywołania właściwości 

Value

 spowoduje zgłoszenie wyjątku.

Z kolei bezpośrednia próba dostępu do zmiennej w warunku (

HasValue = false

) nie po-

woduje tego. Dlatego ważne jest ustalenie, jak powinien działać program, a następnie na-
leży używać tych opcji w odpowiedni sposób. Poniżej znajduje się przykład zastosowania
właściwości 

Value

:

Właściwość 

Value

 w C#:

System.Nullable<bool> hasChildren = null;

Console.WriteLine(hasChildren); // 

Nie jest zgłaszany wyjątek

if (hasChildren != null) {

  Console.WriteLine(hasChildren.Value.ToString());

}

Console.WriteLine(hasChildren.Value); // 

Zgłasza wyjątek InvalidOperationException

background image

88

Część I 

 Wprowadzenie do Visual Studio 2005 i .NET

Właściwość 

Value

 w VB:

Dim hasChildren As Nullable(Of Boolean) = Nothing

Console.WriteLine(hasChildren) ' 

Nie jest zgłaszany wyjątek

If hasChildren.HasValue Then

  Console.WriteLine(hasChildren.Value.ToString())

End If

Console.WriteLine(hasChildren.Value) ' 

Zgłasza wyjątek InvalidOperationException

W powyższych fragmentach kodu bezpośrednie wywołania zmiennej 

hasChildren

 nie po-

wodują zgłoszenia wyjątku. Jednak próba sprawdzania wartości właściwości 

Value

w sytuacji, kiedy zmienna ma wartość 

null

, spowoduje zgłoszenie przez platformę .NET

wyjątku 

InvalidOperationException

.

Typy (klasy) częściowe

Typy częściowe to mechanizm służący do definiowania pojedynczych klas, struktur lub in-
terfejsów w kilku plikach. W rzeczywistości w czasie kompilacji kodu nie ma czegoś takiego
jak typ częściowy. Takie typy istnieją jedynie w czasie tworzenia aplikacji. Na etapie kom-
pilacji zawartość plików definiujących typ częściowy jest łączona w pojedynczą klasę.

Typy częściowe mają rozwiązywać dwa problemy. Po pierwsze, umożliwiają programistom
rozbijanie dużych klas na kilka plików. Pozwala to różnym członkom zespołu pracować
nad tą samą klasą bez konieczności korzystania z tego samego pliku (dzięki czemu uni-
ka się związanych z tym problemów z łączeniem kodu). Po drugie, pozwalają na od-
dzielenie kodu wygenerowanego przez narzędzia od kodu autorstwa programisty. Dzięki
temu plik z kodem programisty będzie przejrzysty (ponieważ jedynie on go pielęgnuje),
a na zapleczu narzędzie może generować inne elementy klasy. Programiści używający
Visual Studio 2005 natychmiast zauważą to, kiedy będą korzystać z formularzy Windows,
nakładek na usługi sieciowe, stron z kodem ukrytym ASP i podobnych narzędzi. Jeśli
korzystałeś z tych elementów w poprzednich wersjach .NET, szybko spostrzeżesz, że
w wersji 2005 w plikach nie ma wygenerowanego kodu, a klasa pisana przez programistę
jest oznaczona jako 

partial

.

Używanie typów częściowych

Typy częściowe zarówno w C#, jak i w Visual Basic deklaruje się za pomocą słowa klu-
czowego 

Partial

. Można stosować to słowo kluczowe do klas, struktur i interfejsów. Musi

ono być pierwszym słowem w deklaracji (przed 

Class

Structure

 czy 

Interface

). Wska-

zanie, że typ jest częściowy, informuje kompilator o tym, że należy połączyć części tej
klasy w pojedynczym pliku .dll lub .exe.

Przy definiowaniu typów częściowych trzeba stosować się do kilku prostych wskazówek.
Po pierwsze, w deklaracji wszystkich typów o tej samej nazwie w tej samej przestrzeni
nazw musi znajdować się słowo kluczowe 

Partial

. Nie można na przykład zadeklarować

klasy 

Partial Public Person

 w jednym pliku, a klasy 

Public Person

 w innym pliku tej

samej przestrzeni nazw — trzeba dodać słowo kluczowe 

Partial

 także do drugiej dekla-

racji. Po drugie, trzeba pamiętać, że wszystkie modyfikatory typu częściowego są łączone
w czasie kompilacji. Obejmuje to atrybuty klasy, komentarze XML i implementacje in-
terfejsu. Na przykład jeśli programista użył atrybutu 

System.SerializableAttribute

 dla

background image

Rozdział 3. 

 Rozszerzenia platformy i języków .NET w wersji 2005

89

typu częściowego, ten atrybut zostanie zastosowany do tego typu w czasie jego łączenia
i kompilacji. Po trzecie, warto pamiętać, że wszystkie typy częściowe muszą zostać skom-
pilowane do tego samego podzespołu (inaczej pakietu, czyli pliku .dll lub .exe; ang. as-
sembly). Nie można skompilować typu częściowego obecnego w kilku podzespołach.

Właściwości z mieszanym poziomem dostępu

W poprzednich wersjach .NET można było określić poziom dostępu (publiczny, prywatny,
chroniony, wewnętrzny) jedynie dla całej właściwości. Jednak często potrzebna jest wła-
ściwość umożliwiająca publiczny odczyt (

get

), ale tylko wewnętrzny zapis (

set

). Jedy-

nym sensownym rozwiązaniem w poprzednich wersjach .NET było pominięcie metody

set

 właściwości. Następnie trzeba było utworzyć nową metodę wewnętrzną służącą do

ustawiania wartości tej właściwości. Kod byłby łatwiejszy do napisania i zrozumienia,
gdyby możliwa była bardziej precyzyjna kontrola nad modyfikatorami dostępu w obrębie
właściwości.

.NET 2.0 daje kontrolę nad modyfikatorami dostępu metod 

set

 i 

get

 właściwości. Dla-

tego można oznaczyć właściwość jako publiczną, ale oznaczyć metodę 

set

 jako prywatną

lub chronioną. Poniżej znajduje się przykładowy kod:

Właściwość z mieszanym poziomem dostępu w C#:

private string _userId;

public string UserId {

  get { return _userId; }

  internal set { userId = value; }

}

Właściwość z mieszanym poziomem dostępu w VB:

Private _userId As String

Public Property UserId() As String

  Get

    Return _userId

  End Get

  Friend Set(ByVal value As String)

    _userId = value

  End Set

End Property

Wieloznaczne przestrzenie nazw

W przypadku dużych projektów mogą wystąpić konflikty przestrzeni nazw między sobą
oraz z platformą .NET (przestrzeń nazw 

System

). Wcześniej nie można było rozwiązać

takich wieloznacznych referencji i na etapie kompilacji pojawiał się wyjątek.

.NET 2.0 umożliwia programistom zdefiniowanie własnej przestrzeni nazw 

System

 bez

blokowania dostępu do wersji platformy .NET. Załóżmy, że programista zdefiniował prze-
strzeń nazw 

System

 i nagle utracił możliwość dostępu do jej globalnej wersji. W języku C#

background image

90

Część I 

 Wprowadzenie do Visual Studio 2005 i .NET

należy dodać wtedy słowo kluczowe 

global

 wraz z kwalifikatorem aliasu przestrzeni

nazw 

::

, tak jak w poniższym wierszu:

global::System.Double myDouble;

W Visual Basic składnia jest podobna, ale używane słowo kluczowe to 

Global

:

Dim myDouble As Global.System.Double

Ponadto można zdefiniować alias, kiedy używa się przestrzeni nazw lub importuje je.
Tego aliasu można następnie używać do wskazywania typów danej przestrzeni nazw.
Załóżmy, że wystąpił konflikt z przestrzenią nazw 

System.IO

. Można wtedy zdefiniować

alias przy jej importowaniu:

C#

using IoAlias = System.IO;

VB

Imports IoAlias = System.IO

Następnie można używać typów za pomocą aliasu. Oczywiście Visual Studio udostępnia
pełną obsługę mechanizmu IntelliSense dla tych elementów. Poniżej znajduje się kod
przedstawiający sposób używania zdefiniowanego wcześniej aliasu. Warto zwrócić uwagę
na nową składnię języka C#, która umożliwia stosowanie operatora w postaci podwójnego
dwukropka:

Nowa składnia języka C#

IoAlias::FileInfo file;

Stara składnia języka C#

IoAlias.FileInfo file;

VB

Dim file as IoAlias.FileInfo

Rozszerzenia języka Visual Basic

Doświadczeni użytkownicy języka Visual Basic ucieszą się na wieść, że w Visual Stu-
dio 2005 została przywrócona właściwość zmień i kontynuuj! Jednak jest to funkcja śro-
dowiska IDE. W rzeczywistości wiele nowych cech IDE jest specyficznych dla języka.
W niniejszej książce chcemy opisać większość z nich (jeśli nie wszystkie). Rozszerzenia
IDE specyficzne dla języka Visual Basic obejmują poniższe właściwości:

 

Programowanie za pomocą skrótów 

My

.

 

Właściwość zmień i kontynuuj.

 

Fragmenty kodu.

 

Rozszerzenia mechanizmu IntelliSense.

 

Modyfikowanie atrybutów w oknie Properties.

background image

Rozdział 3. 

 Rozszerzenia platformy i języków .NET w wersji 2005

91

 

Poprawianie błędów i ostrzeżenia.

 

Asystent do obsługi wyjątków.

 

Dokumentacja XML.

 

Okno Document Outline.

 

Okno projektowe dla projektów.

 

Okno projektowe dla ustawień.

 

Okno projektowe dla zasobów.

Dzięki powyższym rozszerzeniem (a także innym) korzystanie z języka Visual Basic
jest bardzo wygodne. W następnych podpunktach skoncentrujemy się jednak na samym
języku. Wskażemy nowinki specyficzne dla Visual Basic, które są niezwykle atrakcyjne
w wersji 2005.

Instrukcja Continue

Nowa instrukcja 

Continue

 w języku VB umożliwia programistom przeskoczenie do na-

stępnej iteracji pętli. Instrukcji 

Continue

 można używać w pętlach 

Do

For

 i 

While

. Jeśli

potrzebne jest skrócenie pętli i natychmiastowe przejście do następnej iteracji, wystarczy
użyć instrukcji 

Continue For

/

Do

/

While

, tak jak w poniższym kodzie:

Sub ProcessCustomers(ByVal customers() As Customer)

  Dim i As Integer

  For i = 0 To customers.GetUpperBound(0)

    If customers(i).HasTransactions = False Then Continue For

    ProcessCustomer(customers(i))

  Next

End Sub

Typy bez znaku

Programiści języka Visual Basic mogą teraz używać typów całkowitoliczbowych bez
znaku (

UShort

UInteger

 i 

ULong

). Ponadto najnowsza wersja Visual Basic udostępnia

dodatkowy typ ze znakiem, 

SByte

. Te nowe typy umożliwiają programistom łatwiejsze

wywoływanie funkcji interfejsu API systemu Windows, które często zwracają typy bez
znaku. Jednak takie typy bez znaku nie są obsługiwane przez specyfikację wspólnego
języka (ang. Common Language Specification — CLS), dlatego jeśli programista napisze
kod bazujący na tych nowych typach, kod zgodny z CLS może z nim nie współpracować.

Operator IsNot

Nowy operator 

IsNot

 języka Visual Basic umożliwia programistom sprawdzenie, czy

dwa obiekty różnią się od siebie. Oczywiście można to było zrobić także w poprzednich
wersjach, łącząc instrukcje 

Not

 i 

Is

, na przykład 

If Not myCustomer Is Nothing

. Jednak te-

raz programiści mogą korzystać z prostszej składni operatora 

IsNot

, takiej jak w poniższym

background image

92

Część I 

 Wprowadzenie do Visual Studio 2005 i .NET

wierszu kodu. Warto zauważyć, że działanie tego wiersza jest takie samo, jak przestawionej
wcześniej instrukcji 

Not...Is

.

If cust IsNot Nothing Then

Blok Using

Programiści języka Visual Basic, którzy używali przez pewien czas języka C#, bez wąt-
pienia ucieszą się z możliwości definiowania zasięgu obiektów za pomocą bloku 

Using

.

Dzięki temu blokowi programiści języka C# mogą zagwarantować zwolnienie zasobów
w momencie zakończenia wykonywania danego bloku przez aplikację. Obecnie ta właści-
wość została dodana także do języka Visual Basic. Załóżmy, że programista chce nawiązać
połączenie z bazą danych. Teraz może to zrobić w bloku 

Using

. Dzięki temu gdy program

z jakiegoś powodu zakończy wykonywanie tego bloku, obiekt zdefiniowany w instrukcji

Using

 (obiekt połączenia SQL) zostanie usunięty w odpowiedni sposób. Poniższy kod ilu-

struje używanie tej nowej właściwości:

Using cnn As New System.Data.SqlClient.SqlConnection(cnnStr)

  ' 

Tu kod używający połączenia z SQL

End Using

Dostęp do formularzy podobny jak w Visual Basic 6

Programiści znający wersję 6. języka Visual Basic (jeszcze sprzed platformy .NET) przy-
pomną sobie możliwość bezpośredniego dostępu do właściwości i metod formularza
poprzez jego nazwę. W poprzednich wersjach .NET programiści musieli utworzyć egzem-
plarz formularza, aby uzyskać dostęp do jego właściwości. W Visual Basic 8 ponownie
możliwy jest dostęp do składowych formularza poprzez jego nazwę.

Jawne zerowe dolne ograniczenie w tablicach

W starszych wersjach języka Visual Basic (sprzed .NET) programiści mogli określić górne
i dolne  ograniczenie  tablicy, używając słowa kluczowego 

To

. Można było na przykład

zdefiniować tablicę rozpoczynającą się od 1, a kończącą na 10. Dzięki temu kod, w którym
używane były tablice, był bardzo czytelny. Jednak pojawienie się platformy .NET i specy-
fikacji CLS spowodowało, że dolne ograniczenie we wszystkich tablicach musiało być
równe zero (0). Oznacza to, że każda tablica platformy .NET musi rozpoczynać się od ele-
mentu zerowego. W Visual Basic 8 nie uległo to zmianie, znów można jednak określić,
że tablica rozpoczyna się od 0, a kończy na górnym ograniczeniu, co sprzyja czytelności
kodu. Dlatego można definiować tablice w poniższy sposób, jednak dolne ograniczenie
musi równać się zero (0):

Dim myIntArray(0 To 9) As Integer

background image

Rozdział 3. 

 Rozszerzenia platformy i języków .NET w wersji 2005

93

Przeciążanie operatorów

Jeśli często piszesz biblioteki, w końcu natrafisz na klasę, w której będziesz musiał zdefi-
niować działanie operatorów dodawania (

+

), odejmowania (

), mnożenia (

*

), większości (

>

)

i innych. Jeśli na przykład trzeba obliczyć wynik dodawania dwóch wersji klasy za pomocą
operatora 

+

, potrzebna jest definicja jego działania dla tej klasy. W poprzednich wersjach

języka Visual Basic nie można było utworzyć takiej definicji, jednak Visual Basic 8 umoż-
liwia to. Jest to tak zwane przeciążanie operatorów.

Do definiowania nowego operatora służy słowo kluczowe 

Operator

 (używane zamiast

Sub

 lub 

Function

), po którym następuje symbol przeciążanego operatora (

+

&

*

<>

 i tak

dalej). Można następnie dodać ciało tej „funkcji” jak każdej innej. Może ona przyjmować
parametry i zwracać wartość. Jeśli programista chce umożliwić dodawanie do siebie
dwóch obiektów, może zdefiniować operator 

+

 przyjmujący te obiekty jako parametry

i zwracający trzeci obiekt jako wynik. Ilustruje to poniższy kod:

Public Operator +(ByVal obj1 As MyObject, ByVal obj2 As MyObject) As MyObject

  ' 

Obliczanie wartości nowego obiektu i zwracanie go

End Operator

Niestandardowe zdarzenia

Programiści języka Visual Basic mają teraz kontrolę nad rejestrowaniem delegatów, po-
nieważ mogą używać zdarzeń zdefiniowanych przez użytkownika. Nowa wersja Visual
Basic obejmuje słowo kluczowe 

Custom

, którego można używać przy definiowaniu zdarzeń.

Po użyciu tego słowa kluczowego do zadeklarowania zdarzenia trzeba zdefiniować ak-
cesory dla metod 

AddHandler

RemoveHandler

 i 

RaiseEvent

. Te akcesory przesłaniają do-

myślne działanie zdarzenia kodem napisanym przez programistę. Jest to przydatne w sy-
tuacjach, kiedy wszystkie zdarzenia mają być uruchamiane asynchronicznie lub potrzebna
jest pełna kontrola nad tymi operacjami.

Rozszerzenia języka C#

W wersji 2005 język C# został rozszerzony o nowe możliwości. Opisaliśmy już kilka
wspólnych nowinek, takich jak typy ogólne i dopuszczające wartość 

null

. Ponadto pro-

gramiści języka C# mają dostęp do nowych właściwości środowiska IDE. Niektóre z tych
funkcji to:

 

Fragmenty kodu.

 

Refaktoryzacja.

 

Rozszerzenie mechanizmu IntelliSense.

 

Kreatory kodu.

 

Właściwości projektów.

background image

94

Część I 

 Wprowadzenie do Visual Studio 2005 i .NET

W niniejszej książce opiszemy te właściwości. Jednak w tym miejscu skoncentrujemy się
na specyficznych rozszerzeniach języka C# w wersji 2005.

Więcej informacji dotyczących języka C# i omawianych tu zagadnień znajduje się
w udostępnianym przez Microsoft dokumencie „C# Language Specification 2.0”.
Ten dokument można pobrać ze strony http://msdn.microsoft.com/library/
default.asp?url=/library/en-us/dnvs05/html/cs3spec.asp. Pod tym samym adresem
znajduje się kompletny przegląd języka C# oraz zestaw samouczków. Ponadto gotowa
jest już specyfikacja języka C# 3.0, która jest dostępna do przeglądu i recenzji.

Metody anonimowe

Pojęcie metody anonimowe może przy pierwszym napotkaniu wydawać się nieco skom-
plikowane. Są to jednak po prostu nienazwane bloki kodu (nie metody) przekazywane
bezpośrednio do delegata. Po pierwsze, ta właściwość jest dostępna tylko w języku C#.
Po drugie, jest przydatna tylko wtedy, kiedy nie są potrzebne wszystkie możliwości, jakie
dają delegaty — nie trzeba używać wielu jednostek nasłuchujących ani nie jest potrzebna
możliwość kontroli tego, jakie jednostki nasłuchują (poprzez ich dodawanie i usuwanie).

Metody anonimowe najłatwiej jest zrozumieć, porównując je ze standardowym sposobem
używania delegatów. Aby użyć delegatów w poprzednich wersjach języka C#, trzeba było
napisać metodę wywoływaną przez tego delegata, a następnie powiązać ją z delegatem.

Przyjrzyjmy się na przykład sposobowi łączenia kodu ze zdarzeniem 

Click

 przycisku

(

System.Windows.Forms.Button

). Po pierwsze, zdarzenie 

Click

 to 

System.EventHandler

(lub delegat). Trzeba upewnić się, że kod metody jest powiązany z delegatem. Załóżmy,
że kod znajduje się w metodzie, która wygląda następująco:

private void button1_Click(object sender, EventArgs e) {

  label1.Text = "textBox.Text";

}

Następnie należy powiązać metodę z delegatem. Oczywiście Visual Studio wykonuje na
zapleczu wszystkie potrzebne operacje. Można jednak samodzielnie napisać służący do
tego kod. Ponadto Visual Studio obsługuje jedynie wiązanie delegatów kontrolek interfej-
su użytkownika (zdarzeń) z metodami. Programista odpowiada za wiązanie wszystkich
pozostałych delegatów — zarówno tych niestandardowych, jak i będących częścią platfor-
my. Poniższy kod pokazuje, w jaki sposób Visual Studio wiąże metodę 

button1_Click

ze zdarzeniem 

Click

 klasy 

Button

:

this.button1.Click += new System.EventHandler(this.button1_Click);

Jak widać, trzeba napisać metodę z kodem oraz powiązać ją z delegatem. Przyjrzyjmy
się teraz, jakie możliwości dają metody anonimowe. Jak już wspomnieliśmy, można
przekazać kod bezpośrednio do delegata. Dlatego można dodać poniższy wiersz kodu
do konstruktora formularza (po wywołaniu metody 

InitializeComponents

):

this.button1.Click += delegate {

  label1.Text = "Do widzenia";

};

background image

Rozdział 3. 

 Rozszerzenia platformy i języków .NET w wersji 2005

95

Jak widać w powyższym kodzie, używanie metod anonimowych wiąże się z używaniem
słowa kluczowego 

delegate

. Oczywiście delegaty mogą przyjmować parametry, dlatego

po słowie 

delegate

 można umieścić opcjonalną listę parametrów (nie ma jej w powyż-

szym kodzie). Na końcu znajduje się lista instrukcji (blok kodu). To ten kod, ograniczony
nawiasami klamrowymi, jest przekazywany do delegata anonimowo (bez nazwy metody).

Metoda anonimowa ma dostęp do zmiennych znajdujących się w zasięgu w miejscu
tworzenia takiej metody. Te zmienne to tak zwane zmienne zewnętrzne metody
anonimowej (dla odróżnienia od zmiennych wewnętrznych, które są definiowane
wewnątrz metody). Jeśli zmienna zewnętrzna jest używana w metodzie anonimowej,
zostaje przez nią przechwycona. Czas życia takiej przechwyconej zmiennej jest zależny
od usunięcia przez mechanizm przywracania pamięci delegata, a nie samej metody.

Ten punkt stanowi jedynie krótkie wprowadzenie do metod anonimowych. Umożliwiają
one pisanie dość złożonego kodu (który może być mało czytelny). Jak łatwo się domyślić,
przekazywanie wierszy kodu jako parametrów wymaga starannego namysłu, jeśli chce
się uniknąć problemów.

Klasy statyczne

Nowa wersja platformy .NET zapewnia obsługę klas statycznych. Klasa statyczna to taka,
w której każda składowa jest zadeklarowana jako składowa statyczna (w przeciwień-
stwie do składowych egzemplarza). Użytkownicy tej klasy nie muszą tworzyć jej egzem-
plarzy. Platforma gwarantuje nawet, że nie można utworzyć egzemplarza klasy statycz-
nej. Platforma .NET udostępnia wiele takich klas, jednak język Visual Basic na razie ich
nie obsługuje. Robi to jednak język C#. Dlatego to tu przedstawiamy przykładowy kod
bazujący na klasach statycznych.

W języku Visual Basic można utworzyć coś podobnego do klas statycznych, tworząc
klasę o prywatnym konstruktorze. Ponadto należy oznaczyć wszystkie składowe tej
klasy jako 

Shared. Wadą takiego rozwiązania jest brak obsługi tego mechanizmu

przez kompilator czy brak możliwości używania konstruktora statycznego.

Definiowanie klas statycznych

Klasy statyczne tworzy się poprzez dodanie słowa kluczowego 

Static

 do deklaracji

klasy, tak jak w poniższym wierszu kodu:

static class ProjectProperties { ...

Jak już wspomnieliśmy, nie można tworzyć egzemplarzy klasy, która została zadeklaro-
wana jako statyczna. Trzeba jednak pamiętać o zadeklarowaniu wszystkich jej składo-
wych jako statycznych (kompilator nie zakłada, że są właśnie takie). Jednak kompilator
może sprawdzić w klasie statycznej, czy przypadkowo nie znalazła się w niej składowa
egzemplarza. Próba umieszczenia zmiennej niestatycznej w klasie statycznej wywoła błąd
kompilacji. Dotyczy to zarówno składowych publicznych, jak i prywatnych. Listing 3.1
przedstawia prostą klasę statyczną i jej składowe.

background image

96

Część I 

 Wprowadzenie do Visual Studio 2005 i .NET

Listing 3.1. Klasa statyczna

namespace StaticClasses {

  static class ProjectProperties {

    static string _projectName;

    static ProjectProperties() {

      _projectName = "JakiśNowyProjekt";

    }

    public static string Name {

      get { return _projectName; }

    }

    public static DateTime GetDueDate() {

      // 

Pobiera datę planowanego oddania projektu

      DateTime dueDate = DateTime.Now.AddDays(10);

      return dueDate;

    }

  }

}

Klasy statyczne są automatycznie oznaczane jako zamknięte. Oznacza to, że nie
można dziedziczyć po klasach statycznych.

Konstruktory i klasy statyczne

Nie można utworzyć konstruktora dla klasy statycznej. Jednak jeśli potrzebna jest funkcja
podobna do konstruktora (na przykład do ustawiania początkowych wartości), można
napisać tak zwany konstruktor statyczny. Listing 3.1 przedstawia przykładowy konstruktor
statyczny o nazwie 

ProjectProperties

. Warto zauważyć, że inicjuje on wartość składowej

statycznej 

_projectName

.

Środowisko CLR platformy .NET wczytuje klasy statyczne automatycznie w czasie wczy-
tywania zawierających je przestrzeni nazw. Ponadto w momencie wywołania składowej
statycznej środowisko CLR automatycznie wywołuje konstruktor statyczny. W celu wy-
wołania tego specjalnego konstruktora nie trzeba tworzyć egzemplarza klasy statycznej
(nie jest to nawet możliwe).

Używanie dwóch wersji tego samego podzespołu

Programiści czasem potrzebują właściwości starszej wersji komponentu, a jednocześnie
chcą używać jego najnowszej wersji. Często jest to wynikiem zmian wprowadzanych
w komponentach bez uwzględnienia zgodności wstecz. W takich przypadkach możliwości
są ograniczone do całkowitego przerzucenia się na nowy komponent lub pozostania
przy starszej wersji. Język C# umożliwia trzecie rozwiązanie — używanie obu wersji za
pomocą zewnętrznego aliasu podzespołu.

Podstawowym problemem związanym z korzystaniem z wielu wersji tego samego podze-
społu jest rozwiązywanie konfliktów między nazwami składowych znajdujących się w tej
samej przestrzeni nazw. Załóżmy, że programista używa podzespołu generującego wy-
kresy. Odpowiedzialna jest za to klasa 

Chart

 działająca w przestrzeni nazw 

Charting

.

Kiedy zostanie udostępniona następna wersja podzespołu, programista będzie chciał za-

background image

Rozdział 3. 

 Rozszerzenia platformy i języków .NET w wersji 2005

97

chować cały istniejący kod, jednak w nowym kodzie będzie chciał używać najnowszej
wersji. W języku C# można to zrobić, wykonując kilka operacji.

Po pierwsze, trzeba zdefiniować alias nowego podzespołu. W tym celu należy użyć okna
Properties dla wybranej referencji. Rysunek 3.1 pokazuje, jak ustawić taki alias. Warto za-
uważyć, że ustawiany jest alias dla drugiej wersji podzespołu (

ChartV2

). Gwarantuje to, że

wywołania do klasy 

Charting.Chart

 wciąż będą kierowane do pierwszej wersji (

ChartV1

).

Rysunek 3.1.
Definiowanie aliasu

Następnie w pliku z kodem, który ma używać nowej wersji podzespołu, trzeba zdefi-
niować zewnętrzny alias. W tym celu należy przejść do początku pliku (przed instrukcje

Using

) i wpisać instrukcję rozpoczynającą się od słowa kluczowego 

extern

. Poniższy

wiersz pokazuje, jaki kod należy umieścić na początku pliku, aby używać drugiej wersji
komponentu 

Charting

:

extern alias ChartV2;

Do używania składowych nowej wersji podzespołu służy operator 

::

 (podobnie jak w przy-

padku innych, podobnych aliasów języka C#), tak jak w poniższym wierszu kodu:

ChartV2::Charting.Chart.GenerateChart();

Podzespoły zaprzyjaźnione

Język C# 2.0 umożliwia połączenie podzespołów ze względu na dostęp do wewnętrznych
mechanizmów. Oznacza to, że można zdefiniować wewnętrzne składowe, ale udostępnić
je zewnętrznym podzespołom. Ta możliwość jest przydatna, jeśli zamierzasz rozbić pod-
zespół na kilka plików fizycznych, ale wciąż chcesz, aby ich elementy były dostępne we
wszystkich podzespołach.

background image

98

Część I 

 Wprowadzenie do Visual Studio 2005 i .NET

Podzespoły zaprzyjaźnione nie umożliwiają dostępu do składowych prywatnych.

Do oznaczania podzespołów udostępniających swe wewnętrzne składowe zaprzyjaźnionym
podzespołom służy nowy atrybut, 

InternalsVisibleToAttribute

. Ten atrybut jest sto-

sowany na poziomie podzespołu. Do tego atrybutu należy przekazać nazwę oraz znacznik
klucza publicznego zewnętrznego podzespołu. Kompilator będzie traktował te podze-
społy jako zaprzyjaźnione. Podzespół zawierający atrybut 

InternalsVisibleToAttribute

udostępnia swe wewnętrzne składowe drugiemu podzespołowi (ale już nie na odwrót).
Można uzyskać ten sam efekt, używając opcji kompilatora ustawianych w wierszu poleceń.

Podzespoły zaprzyjaźnione, jak to często bywa, mają pewne wady. Zdefiniowanie podze-
społu jako zaprzyjaźnionego z innym podzespołem powoduje ich ścisłe powiązanie. Takie
podzespoły muszą współwystępować, aby były przydatne. Oznacza to, że nie stanowią
już odrębnych jednostek. Może to spowodować nieład, a takimi podzespołami trudniej jest
zarządzać. Często lepiej jest nie korzystać z tej właściwości dopóty, dopóki nie zajdzie
istotna potrzeba.

Rozszerzenia platformy .NET 2.0

Ponieważ w platformie .NET wprowadzono tak wiele nowinek, nie warto rozpoczynać ich
opisu w tym miejscu. Oczywiście postaramy się przedstawić je w następnych rozdziałach.
Chcemy jednak wyróżnić kilka kluczowych rozszerzeń, które sprawiają, że nowa wersja
platformy .NET to poważny krok naprzód. Poniżej przedstawiamy niektóre z tych nowości:

 

Obsługa systemów 64-bitowych — teraz można kompilować aplikacje .NET
przeznaczone dla 64-bitowych wersji systemów operacyjnych. Obejmuje
to obsługę systemów natywnych oraz zgodność z emulatorem WOW64
(umożliwia uruchamianie 32-bitowych aplikacji w systemach 64-bitowych).

 

Obsługa ACL — programiści używający .NET mogą teraz korzystać z listy
kontroli dostępu (ang. Access Control List — ACL) do zarządzania z poziomu
kodu uprawnieniami do zasobów. W przestrzeni nazw 

IO

 (i innych) znajdują się

nowe klasy, które pomagają użytkownikiem nadawać uprawnienia do plików
i wykonywać inne operacje.

 

Strumienie uwierzytelnione — nowa klasa 

NegotiateStream

 umożliwia

bezpieczne (zaszyfrowane przy użyciu SSL) uwierzytelnianie między klientem
a serwerem (jednostką nasłuchującą) w czasie przesyłania informacji w sieci.
Dzięki tej klasie można bezpiecznie przesyłać dane uwierzytelniające klienta
poprzez personifikację lub delegację. Ponadto nowa klasa 

SslStream

 umożliwia

szyfrowanie danych w czasie ich przesyłania.

 

Data Protection API (DPAPI) — w .NET 2.0 zmieniła się obsługa interfejsu
DPAPI. Obecnie obejmuje ona możliwość szyfrowania po stronie serwera hasła
i łańcuchów znaków połączenia. Programiści mogli używać tych opcji także
w poprzednich wersji .NET, pobierając specjalną nakładkę. W wersji 2.0
dostęp do tego interfejsu jest wbudowany w platformę.

background image

Rozdział 3. 

 Rozszerzenia platformy i języków .NET w wersji 2005

99

 

Wykrywanie zmian w sieci — aplikacja może teraz otrzymywać
powiadomienia o utracie połączenia z siecią. Dzięki klasie 

NetworkChange

programiści wiedzą, kiedy komputer, na którym działa aplikacja, utracił
bezprzewodowe połączenie lub zmienił adres IP.

 

Obsługa protokołu FTP — przestrzeń nazw 

System.Net

 udostępnia obecnie

klasy służące do obsługi protokołu FTP. Programiści mogą używać klas

WebRequest

WebResponse

 i 

WebClient

 do przesyłania oraz pobierania plików

poprzez ten protokół.

 

Rozszerzenia dotyczące globalizacji — nowa wersja platformy umożliwia
programistom definiowanie własnych niestandardowych ustawień lokalnych.
Daje to niezwykłą elastyczność w zakresie obsługi w aplikacjach informacji
dotyczących kultury. Ponadto platforma .NET 2.0 zapewnia ulepszoną obsługę
Unicode.

 

Większa kontrola nad pamięcią podręczną — programiści mogą teraz
używać przestrzeni nazw 

System.Net.Cache

 do programowej kontroli pamięci

podręcznej.

 

Obsługa szeregowych urządzeń wejścia-wyjścia — w przestrzeni nazw

System.IO

 znajduje się nowa klasa 

SerialPort

. Ta klasa umożliwia

programistom używanie urządzeń, które łączą się z portami szeregowymi
komputera.

 

Rozszerzona obsługa protokołu SMTP — przestrzeń nazw 

System.Net.Mail

umożliwia programistom przesyłanie listów elektronicznych za pomocą
serwera SMTP.

 

Transakcje — programiści używający .NET mogą teraz korzystać z nowej
przestrzeni nazw 

System.Transactions

, która umożliwia klasom utworzonym

dla platformy .NET łatwe uczestniczenie w transakcjach rozproszonych.
Do obsługi transakcji służy koordynator transakcji rozproszonych Microsoftu
(ang. Microsoft Distributed Transaction Coordinator — MSDTC).

Nowe właściwości w podstawowych technologiach

ADO.NET, ASP.NET i formularze Windows zostały rozbudowane w wersji 2005. Każda
z tych technologii mogłaby być tematem odrębnej książki. Na przykład ADO.NET ob-
sługuje obecnie typy definiowane przez użytkownika (ang. User-Defined Type — UDT)
i asynchroniczne operacje w bazie danych. Zarówno ASP, jak i formularze Windows
udostępniają wiele nowych kontrolek (oraz rozbudowane wersje starych). W obu tych tech-
nologiach możliwe jest wiązanie danych bez konieczności pisania kodu. Radzimy do-
kładnie zapoznać się z tymi zagadnieniami i przyjrzeć się wielu nowym właściwościom
w zakresie tych technologii.

background image

100

Część I 

 Wprowadzenie do Visual Studio 2005 i .NET

Podsumowanie

W tym rozdziale przedstawiliśmy podstawowe rozszerzenia języka .NET, które są klu-
czowe dla programistów, ponieważ ułatwiają szybsze pisanie lepszego kodu. Nowinki
takie jak typy ogólne pomagają zapewnić bezpieczeństwo typów w kolekcjach, co po-
zwala zmniejszyć liczbę błędów. Typy dopuszczające wartość 

null

 pozwalają pisać kod

bez konieczności przypisywania wartości niezainicjowanym zmiennym i obsługi „ma-
gicznych liczb”. Te i podobne nowości wprowadzone w językach C# i Visual Basic
przyczyniają się do ewolucji omawianego zestawu narzędzi i zwiększają produktywność
programistów.

Na zakończenie rozdziału pokrótce opisaliśmy niektóre z nowych elementów platformy
.NET. Dostępnych jest mnóstwo nowinek. Platforma staje się tak rozbudowana, że progra-
miści (i książki) często są wyspecjalizowani w danym obszarze. Radzimy przejrzeć listę
rozszerzeń, a następnie kontynuować eksplorację w zakresie interesującej Cię dziedziny.