You are on page 1of 43

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

Visual Basic 2005.


Zapiski programisty
Autor: Matthew MacDonald
Tumaczenie: Grzegorz Werner
ISBN: 83-246-0087-6
Tytu oryginau: Visual Basic 2005: A Developers Notebook
Format: B5, stron: 304
Przykady na ftp: 1986 kB

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Visual Basic 2005 nie jest tak rewolucyjnym produktem, jak Visual Basic .NET.
Opracowujc wersj 2005, twrcy jzyka skoncentrowali si na usuniciu bdw
i usterek oraz zwikszeniu komfortu pracy programisty. Narzdzia i kontrolki,
w ktre wyposaono zarwno najnowsz wersj Visual Basica, jak i rodowisko
programistyczne Visual Studio 2005, pozwalaj znacznie przyspieszy pisanie kodu.
Jednoczenie zosta zachowany dostp do wszystkich moliwoci platformy .NET.
Ksika Visual Basic 2005. Zapiski programisty to zbir notatek spisanych przez
programistw analizujcych t wersj jzyka. Zawiera wiczenia ilustrujce nowe
funkcje Visual Basica 2005, platformy .NET Framework 2.0 i rodowiska
programistycznego Visual Studio 2005. Programici korzystajcy z wczeniejszych
wersji tych narzdzi szybko opanuj nowe funkcje, takie jak definiowanie klas
generycznych czy korzystanie z obiektw My. Godne odnotowania jest take znaczne
przyspieszenie i udoskonalenie technologii ASP.NET.
Edycja kodu w Visual Studio 2005
Tworzenie dokumentacji w formacie XML
Korzystanie z obiektw My
Definiowanie klas generycznych
Tworzenie aplikacji dla rodowiska Windows oraz aplikacji WWW
Projektowanie formularzy
Komunikacja z bazami danych
Wdraanie aplikacji za pomoc technologii ClickOnce
Dziki tej ksice najnowsza wersja Visual Basica odsania swoje tajemnice.

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Spis treci

Seria Zapiski programisty .................................................................. 7


Przedmowa .......................................................................................... 13
Rozdzia 1. Visual Studio ..................................................................... 19
Podstawowe informacje o Visual Studio 2005 ..................................... 20
Kodowanie, debugowanie i kontynuacja
bez ponownego uruchamiania aplikacji ............................................ 23
Zagldanie do wntrza obiektu podczas debugowania ........................ 26
Diagnozowanie i poprawianie bdw w locie .................................. 29
Zmiana nazwy wszystkich wystpie dowolnego elementu programu .... 31
Filtrowanie IntelliSense i autokorekta ................................................. 35
Wywoywanie metod podczas projektowania aplikacji ........................ 37
Wstawianie szablonowego kodu .......................................................... 39
Tworzenie dokumentacji XML ............................................................ 41
Rozdzia 2. Jzyk Visual Basic ............................................................. 47
Wykonywanie popularnych zada za pomoc obiektw My ............... 48
Uzyskiwanie informacji o aplikacji ..................................................... 52
Uywanie cile typizowanych zasobw ............................................. 54

Uywanie cile typizowanych ustawie konfiguracyjnych ................57


Tworzenie klas generycznych .............................................................60
Uywanie wartoci pustych w prostych typach danych .......................65
Uywanie operatorw w poczeniu z wasnymi obiektami ................67
Dzielenie klasy na wiele plikw ...........................................................72
Rozszerzanie przestrzeni nazw My .....................................................73
Przechodzenie do nastpnej iteracji ptli .............................................76
Automatyczne usuwanie obiektw .......................................................79
Ochrona waciwoci przy uyciu rnych poziomw dostpu ............81
Testowanie kolejnych czci wyraenia warunkowego .......................82
Rozdzia 3. Aplikacje Windows ............................................................ 85
Uywanie paskw narzdzi w stylu pakietu Office ..............................86
Dodawanie dowolnych kontrolek do paska ToolStrip ...........................91
Dodawanie ikon do menu ....................................................................92
Wywietlanie strony WWW w oknie aplikacji .....................................95
Weryfikowanie danych podczas ich wpisywania ................................99
Tworzenie pl tekstowych z funkcj autouzupeniania ......................103
Odtwarzanie systemowych dwikw Windows ................................105
Odtwarzanie prostych dwikw WAV ..............................................106
Tworzenie podzielonego okna w stylu Eksploratora Windows ...........108
Automatyczne rozmieszczanie kontrolek ...........................................111
Okrelanie momentu zakoczenia aplikacji .......................................113
Zapobieganie uruchamianiu wielu kopii aplikacji ..............................117
Komunikacja midzy formularzami ..................................................118
Przyspieszanie przerysowywania GDI+ ...........................................120
Bezpieczna obsuga zada asynchronicznych ...................................124
Lepsza siatka danych ........................................................................128
Formatowanie siatki DataGridView ...................................................132
Dodawanie obrazw i kontrolek do siatki DataGridView ....................135

Spis treci

Rozdzia 4. Aplikacje WWW ............................................................... 139


Tworzenie aplikacji WWW w Visual Studio 2005 ............................. 140
Administrowanie aplikacj WWW .................................................... 143
Wizanie danych bez pisania kodu ................................................... 146
Wizanie kontrolek WWW z niestandardow klas ......................... 151
Wywietlanie interaktywnych tabel bez pisania kodu ....................... 156
Wywietlanie pojedynczych rekordw .............................................. 159
Ujednolicanie wygldu aplikacji przy uyciu stron szablonu ............ 165
Dodawanie elementw nawigacyjnych do witryny WWW ................ 170
atwe uwierzytelnianie uytkownikw ............................................. 174
Sprawdzanie biecej liczby uytkownikw witryny ......................... 182
Uwierzytelnianie oparte na rolach .................................................... 183
Przechowywanie indywidualnych informacji o uytkownikach ........ 188
Rozdzia 5. Pliki, bazy danych i XML .................................................. 195
Pobieranie informacji o dyskach ....................................................... 196
Pobieranie informacji o plikach i katalogach ..................................... 199
Kopiowanie, przenoszenie i usuwanie plikw ................................... 201
Odczytywanie i zapisywanie plikw .................................................. 204
Kompresowanie i dekompresowanie danych .................................... 206
Gromadzenie danych statystycznych
o poczeniach ze rdami danych ................................................ 209
czenie polece adaptera danych w celu zwikszenia wydajnoci .. 212
Hurtowe kopiowanie wierszy z jednej tabeli do drugiej ..................... 215
Pisanie kodu niezalenego od uywanej bazy danych ....................... 219
Nowe klasy XPathDocument i XPathNavigator ................................. 224
Edycja dokumentw XML przy uyciu klasy XPathNavigator .......... 229
Rozdzia 6. Usugi platformy .NET ...................................................... 235
atwe rejestrowanie zdarze ............................................................ 236
Sprawdzanie cznoci z innym komputerem ................................... 240
Uzyskiwanie informacji o poczeniu sieciowym .............................. 243

Spis treci

Wysyanie i pobieranie plikw przy uyciu FTP ................................246


Testowanie przynalenoci grupowej biecego uytkownika ...........253
Szyfrowanie danych dla biecego uytkownika ...............................255
Ujarzmianie konsoli ..........................................................................258
Mierzenie czasu wykonywania kodu .................................................262
Wdraanie aplikacji za pomoc technologii ClickOnce .......................264
Skorowidz .......................................................................................... 271

Spis treci

ROZDZIA 2

Jzyk Visual Basic

W tym rozdziale:
 Wykonywanie popularnych zada za pomoc obiektw My
 Uzyskiwanie informacji o aplikacji
 Uywanie cile typizowanych zasobw
 Uywanie cile typizowanych ustawie konfiguracyjnych
 Tworzenie klas generycznych
 Uywanie wartoci pustych w prostych typach danych
 Uywanie operatorw w poczeniu z wasnymi obiektami
 Dzielenie klasy na wiele plikw
 Rozszerzanie przestrzeni nazw My
 Przechodzenie do nastpnej iteracji ptli
 Automatyczne usuwanie obiektw

Kiedy pojawia si pierwsza wersja Visual Basica .NET, lojalni programici VB byli zaszokowani drastycznymi zmianami w ich ulubionym
jzyku. Ni std, ni zowd proste czynnoci, takie jak tworzenie instancji
obiektu i deklarowanie struktury, wymagay nowej skadni, a podstawowe typy, na przykad tablice, zostay przeksztacone w co zupenie
innego. Na szczcie w Visual Basicu 2005 nie ma takich niespodzianek.
Zmiany w najnowszych wersjach jzyka upraszczaj programowanie,
47

ale nie sprawiaj, e istniejcy kod staje si przestarzay. Wiele spord


tych zmian to funkcje przeniesione z jzyka C# (na przykad przecianie operatorw), a inne to zupenie nowe skadniki wbudowane w najnowsz wersj wsplnego rodowiska uruchomieniowego (na przykad
klasy generyczne). W tym rozdziale opiszemy najprzydatniejsze zmiany
w jzyku VB.

Wykonywanie popularnych zada


za pomoc obiektw My
Nowe obiekty My zapewniaj atwy dostp do popularnych funkcji, ktre
nieatwo jest znale w obszernej bibliotece klas .NET. Zasadniczo obiekty
My udostpniaj rnorodne elementy, od rejestru Windows do ustawie
biecego poczenia sieciowego. Co najlepsze, hierarchia obiektw My jest
zorganizowana wedug zastosowa i atwo si po niej porusza przy
uyciu IntelliSense.
Przedzieranie si
przez obszern
bibliotek klas .NET
w poszukiwaniu
potrzebnej funkcji
bywa mczce.
Dziki nowym
obiektom My mona
szybko znale
najprzydatniejsze
funkcje oferowane
przez .NET.

Jak to zrobi?
Istnieje siedem podstawowych obiektw My. Spord nich trzy kluczowe
obiekty centralizuj zestaw funkcji .NET Framework i dostarczaj informacji o komputerze. S to:
My.Computer

Ten obiekt zawiera informacje o komputerze, w tym o jego poczeniu sieciowym, stanie myszy i klawiatury, biecym katalogu, drukarce, ekranie oraz zegarze. Mona te uy go jako punktu wyjcia
do odtwarzania dwikw, wyszukiwania plikw, dostpu do rejestru albo korzystania ze schowka Windows.
My.Application

Ten obiekt zawiera informacje o biecej aplikacji i jej kontekcie,


w tym o podzespole i jego wersji, kulturze, a take o argumentach
wiersza polecenia uytych podczas uruchamiania aplikacji. Mona
go rwnie uy do rejestrowania zdarze wystpujcych w aplikacji.

48

Rozdzia 2: Jzyk Visual Basic

My.User

Ten obiekt zawiera informacje o biecym uytkowniku. Mona uy


go do sprawdzenia konta uytkownika Windows i ustalenia, do jakiej
grupy naley uytkownik.
Obok tych trzech obiektw istniej kolejne dwa, ktre zapewniaj dostp do
instancji domylnych. Instancje domylne to obiekty, ktre .NET tworzy
automatycznie dla pewnych typw klas zdefiniowanych w aplikacji. S to:
My.Forms

Ten obiekt zapewnia instancj domyln kadego formularza Windows


w aplikacji. Mona uy go do obsugi komunikacji midzy formularzami bez ledzenia referencji do formularzy w oddzielnej klasie.
My.WebServices

Ten obiekt zapewnia instancj domyln klasy poredniczcej dla


kadej usugi WWW. Jeli na przykad projekt uywa dwch referencji WWW, poprzez ten obiekt mona uzyska dostp do gotowej klasy
poredniczcej dla kadej z nich.
Kolejne dwa obiekty My zapewniaj atwy dostp do ustawie konfiguracyjnych i zasobw:
My.Settings

Ten obiekt umoliwia pobranie ustawie z pliku konfiguracyjnego


XML aplikacji.
My.Resources

Ten obiekt umoliwia pobieranie zasobw blokw danych binarnych lub tekstowych, ktre s kompilowane z podzespoem aplikacji.
Zasobw zwykle uywa si do przechowywania wielojzycznych acuchw, obrazw i plikw dwikowych.
O S T R Z E E N I E
Warto zaznaczy, e dziaanie obiektw My zaley od typu projektu.
Na przykad w aplikacjach WWW lub aplikacjach konsoli nie mona
korzysta z kolekcji My.Forms.

Wykonywanie popularnych zada za pomoc obiektw My

49

Niektre spord klas My s zdefiniowane w przestrzeni nazw Microsoft.


VisualBasic.MyServices, a inne, na przykad klasy uywane w obiektach My.Settings i My.Resources, s tworzone dynamicznie przez Visual
Studio 2005 podczas modyfikowania ustawie aplikacji i dodawania zasobw do biecego projektu.
Aby wyprbowa obiekt My, mona skorzysta z funkcji IntelliSense.
Wystarczy wpisa sowo My oraz kropk i obejrze dostpne obiekty (rysunek 2.1). Nastpnie mona wybra jeden z nich i wpisa kolejn kropk,
aby przej na niszy poziom hierarchii.

Rysunek 2.1. Przegldanie obiektw My

W celu wyprbowania prostego kodu, ktry wywietla kilka podstawowych


informacji z wykorzystaniem obiektu My, utwrzmy nowy projekt typu
Console Application. Nastpnie dodajmy poniszy kod do procedury Main():
Console.WriteLine(My.Computer.Name)
Console.WriteLine(My.Computer.Clock.LocalTime)
Console.WriteLine(My.Computer.FileSystem.CurrentDirectory)
Console.WriteLine(My.User.Name)

Po uruchomieniu tego kodu w oknie konsoli zostanie wywietlona nazwa


komputera, biecy czas, biecy katalog oraz nazwa uytkownika:
SALESSERVER
2005-07-06 11:18:18
C:\Kod\NotatnikVB\1.07\Test\bin
MATTHEW

50

Rozdzia 2: Jzyk Visual Basic

O S T R Z E E N I E
Obiekt My ma rwnie ciemn stron. Rozwizania, w ktrych go
zastosowano, trudniej wspuytkowa z innymi programistami,
poniewa nie jest on obsugiwany w jzykach innych ni VB (na
przykad C#).

Wicej informacji
Aby dowiedzie si wicej o obiekcie My i zobaczy przykady jego uycia, naley zajrze pod haso indeksu My Object w pomocy MSDN.
Mona te wykona inne wiczenia, w ktrych wykorzystano obiekt My.
Oto kilka przykadw:
uywanie obiektu My.Application do pobierania informacji o programie, takich jak bieca wersja oraz parametry wiersza polecenia
podane podczas uruchamiania aplikacji (wiczenie Uzyskiwanie
informacji o aplikacji dalej w tym rozdziale);
wczytywanie obrazw i innych zasobw z podzespou aplikacji za
pomoc obiektu My.Resources (wiczenie Uywanie cile typizowanych zasobw dalej w tym rozdziale);
pobieranie ustawie aplikacji i uytkownika za pomoc obiektu
My.Settings (wiczenie Uywanie cile typizowanych ustawie
konfiguracyjnych dalej w tym rozdziale);
uywanie obiektu My.Forms do interakcji midzy oknami aplikacji
(wiczenie Komunikacja midzy formularzami w rozdziale 3.);
manipulowanie plikami i poczeniami sieciowymi za pomoc obiektu
My.Computer (rozdziay 5. i 6.);
uwierzytelnianie uytkownika za pomoc obiektu My.User (wiczenie
Testowanie przynalenoci grupowej biecego uytkownika w rozdziale 6.).

Wykonywanie popularnych zada za pomoc obiektw My

51

Za pomoc obiektu
My.Application
mona pobra
informacje o biecej
wersji aplikacji,
jej pooeniu
oraz parametrach
uytych do jej
uruchomienia.

Uzyskiwanie informacji o aplikacji


Obiekt My.Application udostpnia wiele przydatnych informacji. W celu
ich pobrania wystarczy odczyta waciwoci obiektu.

Jak to zrobi?
Informacje zawarte w obiekcie My.Application przydaj si w wielu rnych sytuacjach. Oto dwa przykady:
Chcemy ustali dokadny numer wersji. Bywa to uyteczne, jeli
chcemy wywietli dynamiczne okno z informacjami o programie
albo sprawdzi usug WWW i upewni si, e mamy najnowsz
wersj podzespou.
Chcemy zarejestrowa pewne informacje diagnostyczne. Jest to istotne,
jeli problem wystpuje u klienta i musimy zapisa oglne informacje
o dziaajcej aplikacji.
Aby sprawdzi, jak to dziaa, mona wykorzysta kod z listingu 2.1 w aplikacji konsoli. Pobiera on wszystkie informacje i wywietla je w oknie
konsoli.
Listing 2.1. Pobieranie informacji z obiektu My.Application
' Ustalamy parametry, z jakimi zostaa uruchomiona aplikacja
Console.Write("Parametry wiersza polecenia: ")
For Each Arg As String In My.Application.CommandLineArgs
Console.Write(Arg & " ")
Next
Console.WriteLine()
Console.WriteLine()
' Pobieramy informacje o podzespole, w ktrym znajduje si ten kod
' Informacje te pochodz z metadanych (atrybutw w kodzie)
Console.WriteLine("Firma: " & My.Application.Info.CompanyName)
Console.WriteLine("Opis: " & My.Application.Info.Description)
Console.WriteLine("Lokalizacja: " & My.Application.Info.DirectoryPath)
Console.WriteLine("Prawa autorskie: " & My.Application.Info.Copyright)
Console.WriteLine("Znak towarowy: " & My.Application.Info.Trademark)
Console.WriteLine("Nazwa: " & My.Application.Info.AssemblyName)
Console.WriteLine("Produkt: " & My.Application.Info.ProductName)
Console.WriteLine("Tytu: " & My.Application.Info.Title)
Console.WriteLine("Wersja: " & My.Application.Info.Version.ToString())
Console.WriteLine()

52

Rozdzia 2: Jzyk Visual Basic

WS KAZWK A
Visual Studio 2005 zawiera okno Quick Console, ktre jest uproszczon wersj zwykego okna wiersza polece. W niektrych przypadkach okno to dziaa nieprawidowo. W razie problemw z uruchamianiem przykadowej aplikacji i wywietlaniem jej wynikw
naley wyczy okno Quick Console. W tym celu naley wybra
z menu Tools polecenie Options, upewni si, e zaznaczone jest pole
wyboru Show all settings, po czym przej do pozycji Debugging >
General. Nastpnie naley usun zaznaczenie z pola Redirect all
console output to the Quick Console window.

Przed przetestowaniem powyszego kodu warto skonfigurowa rodowisko


tak, aby program zwrci sensowne wyniki. Mona na przykad przekaza parametry wiersza polecenia do uruchamianej aplikacji. W tym celu
naley klikn dwukrotnie ikon My Project w oknie Solution Explorer.
Nastpnie naley przej na zakadk Debug i poszuka pola tekstowego
Command line parameters. W polu tym naley wpisa parametry wiersza
polecenia, na przykad /a /b /c.
Aby okreli informacje, takie jak autor podzespou, produkt, wersja itd.,
trzeba doda specjalne atrybuty do pliku AssemblyInfo.vb, ktry zwykle
nie jest widoczny w oknie Solution Explorer. Aby go wywietli, naley
wybra z menu Project polecenie Show All Files. Plik AssemblyInfo.vb
jest umieszczony pod wzem My Project. Oto typowy zestaw znacznikw, ktre mona okreli w tym pliku:
<Assembly:
<Assembly:
<Assembly:
<Assembly:
<Assembly:
<Assembly:
<Assembly:

AssemblyVersion("1.0.0.0")>
AssemblyCompany("Prosetech")>
AssemblyDescription("Program testujcy obiekt My.Application")>
AssemblyCopyright("(C) Matthew MacDonald")>
AssemblyTrademark("(R) Prosetech")>
AssemblyTitle("Aplikacja testowa")>
AssemblyProduct("Aplikacja testowa")>

Wszystkie te informacje zostan osadzone w skompilowanym podzespole jako metadane.


Teraz mona uruchomi testow aplikacj. Oto przykadowe wyniki:
Parametry wiersza polecenia: /a /b /c
Firma: Prosetech
Opis: Program testujcy obiekt My.Application
Lokalizacja: C:\NotatnikVB\2\InformacjeOAplikacji\bin\Debug

Uzyskiwanie informacji o aplikacji

Nowoci w VB
2005 jest moliwo
dodawania informacji o aplikacji
w specjalnym oknie
dialogowym. Aby
skorzysta z tej
funkcji, naley
klikn dwukrotnie
ikon My Project
w oknie Solution
Explorer, przej na
zakadk Application
i klikn przycisk
Assembly Information.

53

Prawa autorskie: (C) Matthew MacDonald


Znak towarowy: (R) Prosetech
Nazwa: InformacjeOAplikacji
Produkt: Aplikacja testowa
Tytu: Aplikacja testowa
Wersja: 1.0.0.0

A co
z uzyskiwaniem bardziej szczegowych informacji diagnostycznych?
Obiekt My.Computer.Info ma dwie przydatne waciwoci, ktre dostarczaj takich informacji. Waciwo LoadedAssemblies to kolekcja wszystkich podzespow, ktre s obecnie wczytane (i dostpne dla aplikacji).
Mona te zbada ich wersje oraz informacje o wydawcy. Waciwo
StackTrace zawiera biecy obraz stosu i pozwala ustali, ktr cz
kodu obecnie wykonuje program. Jeli na przykad metoda Main() wywouje metod A(), a ta wywouje metod B(), na stosie bdzie wida te
trzy metody B(), A() i Main() w odwrotnej kolejnoci.
Oto kod, ktry wywietla te informacje:
Console.WriteLine("Wczytane podzespoy:")
For Each Assm As System.Reflection.Assembly In _
My.Application.Info.LoadedAssemblies
Console.WriteLine(Assm.GetName().Name)
Next
Console.WriteLine()
Console.WriteLine("Biecy stos: " & My.Application.Info.StackTrace)
Console.WriteLine()

cile typizowane
zasoby umoliwiaj
osadzanie statycznych danych (na
przykad obrazw)
w skompilowanych
podzespoach
i zapewniaj atwy
dostp do tych danych
z poziomu kodu.

54

Uywanie cile typizowanych zasobw


Podzespoy .NET oprcz kodu mog zawiera zasoby osadzone dane
binarne, na przykad obrazy i niezmienne acuchy. Cho rodowisko
.NET obsuguje zasoby ju od wersji 1.0, Visual Studio nie oferowao ich
zintegrowanej obsugi w czasie projektowania aplikacji. W rezultacie
programici, ktrzy chcieli zapisa dane obrazu w swojej aplikacji, zwykle dodawali je do kontrolek obsugujcych obrazy podczas projektowania aplikacji, takich jak PictureBox lub ImageList. Kontrolki te automatycznie wstawiay dane obrazu do pliku zasobw aplikacji.

Rozdzia 2: Jzyk Visual Basic

W Visual Studio 2005 znacznie atwiej jest dodawa informacje do plikw


zasobu i pniej je aktualizowa. Co najlepsze, mona uzyska dostp do
tych informacji z dowolnego punktu kodu, i to ze cis kontrol typw.

Jak to zrobi?
Aby utworzy cile typizowany zasb na uytek tego wiczenia, naley
zacz od utworzenia nowej aplikacji Windows.
W celu dodania zasobu naley klikn dwukrotnie wze My Project
w oknie Solution Explorer. Pojawi si okno projektu aplikacji, w ktrym
mona skonfigurowa wiele rnorodnych ustawie programu. Nastpnie naley przej na zakadk Resources i wybra dany typ zasobw
z listy rozwijanej umieszczonej w lewym grnym oknie (Strings, Images,
Audio itd.). Widok acuchw przedstawia siatk danych. Widok obrazw
jest nieco inny domylnie pokazuje miniatury doczonych obrazw.
Aby doda nowy obraz, naley wybra z listy kategori Images, a nastpnie klikn strzak obok przycisku Add Resource i wybra polecenie
Add Existing File. Naley znale plik obrazu, zaznaczy go i klikn
przycisk OK. Ci, ktrzy nie maj pod rk innego obrazu, mog wykorzysta jeden spord plikw przechowywanych w katalogu Windows,
na przykad winnt256.bmp (ktry jest doczany do wikszoci wersji
Windows).
Domylnie zasb ma t sam nazw co plik, ale mona j zmieni po dodaniu
zasobu. W tym przykadzie zmienimy nazw obrazu na EmbeddedGraphic
(jak pokazano na rysunku 2.2).
Korzystanie z zasobw jest bardzo atwe. Wszystkie zasoby s kompilowane dynamicznie w cile typizowan klas zasobw, do ktrej mona
uzyska dostp poprzez obiekt My.Resources. Aby wyprbowa nowo
dodany zasb, naley doda kontrolk PictureBox do formularza Windows (i zachowa domyln nazw PictureBox1). Nastpnie naley doda
poniszy kod, ktry wywietli obraz podczas wczytywania formularza:
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

Klasa zasobw
jest dodawana do
wza My Project
i otrzymuje nazw
Resources.Designer.vb.
Aby j zobaczy,
trzeba wybra
z menu Project
polecenie Show All
Files. Oczywicie, nie
naley modyfikowa
tego pliku rcznie.

PictureBox1.Image = My.Resources.EmbeddedGraphic
End Sub

Uywanie cile typizowanych zasobw

55

Rysunek 2.2. Dodawanie obrazu jako cile typizowanego zasobu

Po uruchomieniu programu obraz zostanie wywietlony na formularzu.


Aby upewni si, e obraz jest pobierany z podzespou, mona skompilowa aplikacj, a nastpnie usun plik obrazu (kod bdzie nadal dziaa bez adnych problemw).
Inn zalet zasobw
jest to, e mona
wykorzysta te
same obrazy w wielu
kontrolkach na
rnych formularzach bez dodawania
wielu kopii obrazu
do jednego pliku.

Kiedy dodajemy zasoby w taki sposb, Visual Studio kopiuje je do podkatalogu Resources aplikacji. Katalog ten, wraz z zawartymi w nim zasobami, mona obejrze w oknie Solution Explorer. Podczas kompilowania
aplikacji wszystkie zasoby s osadzane w podzespole, ale przechowywanie ich w oddzielnym katalogu ma pewn wan zalet pozwala
zaktualizowa zasb przez zamian pliku i ponowne skompilowanie aplikacji. Nie trzeba modyfikowa kodu. Jest to niezwykle przydatne, jeli trzeba
jednoczenie zaktualizowa wiele obrazw albo innych zasobw.
Zasoby mona docza do rnych kontrolek za pomoc okna Properties.
Na przykad po klikniciu wielokropka (...) obok waciwoci Image
kontrolki PictureBox pojawi si okno z list wszystkich obrazw dostpnych w zasobach aplikacji.

56

Rozdzia 2: Jzyk Visual Basic

A co
z kontrolk ImageList? Wikszo programistw Windows zna t
kontrolk, ktra grupuje wiele obrazw (zwykle niewielkich map bitowych)
na uytek innych kontrolek, takich jak menu, paski narzdzi, drzewa i listy. Kontrolka ImageList nie uywa typizowanych zasobw, lecz wasnej metody serializacji. Cho dostp do zawartych w niej obrazw mona
uzyska zarwno podczas projektowania aplikacji, jak i metod programistyczn, nie podlega ona kontroli typw.

Uywanie cile typizowanych


ustawie konfiguracyjnych
Aplikacje czsto uywaj ustawie konfiguracyjnych, na przykad wskazujcych pooenie plikw, parametry poczenia z baz danych i preferencje uytkownika. Zamiast kodowa te ustawienia na sztywno (albo
wymyla wasny mechanizm ich przechowywania), w .NET mona doda
je do pliku konfiguracyjnego specyficznego dla aplikacji. Dziki temu
mona je atwo modyfikowa poprzez edycj pliku tekstowego, bez ponownego kompilowania aplikacji.

Tworzenie ustawie
konfiguracyjnych
w oknie projektu
aplikacji.

W Visual Studio 2005 jest to jeszcze atwiejsze, poniewa ustawienia


konfiguracyjne s kompilowane w oddzieln klas i podlegaj cisej
kontroli typw. Oznacza to, e mona pobiera ustawienia przy uyciu
waciwoci, z wykorzystaniem funkcji IntelliSense, zamiast zdawa si
na wyszukiwanie tekstowe. Co najlepsze, .NET rozszerza ten model
o moliwo uywania ustawie specyficznych dla uytkownika w celu
ledzenia preferencji i innych informacji. W niniejszym wiczeniu zostan zaprezentowane obie te techniki.

Jak to zrobi?
Kade ustawienie konfiguracyjne jest definiowane przez unikatow nazw. W poprzednich wersjach .NET mona byo pobra warto ustawienia konfiguracyjnego poprzez wyszukanie jego nazwy w kolekcji. Jeli jednak nazwa bya nieprawidowa, bd mona byo wykry dopiero
po uruchomieniu programu i wystpieniu wyjtku czasu wykonania.
Uywanie cile typizowanych ustawie konfiguracyjnych

57

W aplikacji WWW
ustawienia konfiguracyjne s umieszczane
w pliku web.config.
W innych aplikacjach
ustawienia s
umieszczane w pliku
noszcym t sam
nazw co aplikacja
i uzupenion
rozszerzeniem
.config, na przykad
MojaAplikacja.
exe.config.

W Visual Studio 2005 sytuacja wyglda znacznie lepiej. Aby doda nowe
ustawienie konfiguracyjne, naley klikn dwukrotnie wze My Project
w oknie Solution Explorer. Pojawi si okno projektu aplikacji, w ktrym
mona skonfigurowa wiele rnorodnych ustawie programu. Nastpnie naley przej na zakadk Settings, ktra pokazuje list niestandardowych ustawie konfiguracyjnych i umoliwia zdefiniowanie nowych
ustawie oraz ich wartoci.
Aby doda do aplikacji nowe ustawienie konfiguracyjne, naley wpisa
jego nazw na dole listy. Nastpnie naley okreli typ danych, zasig
i rzeczywist warto ustawienia. Aby na przykad doda ustawienie ze
ciek do pliku, mona uy nazwy UserDataFilePath, typu String,
zasigu Application (niebawem powiemy wicej na ten temat) oraz wartoci c:\MyFiles. Ustawienie to pokazano na rysunku 2.3.

Rysunek 2.3. Definiowanie cile typizowanego ustawienia konfiguracyjnego

Po dodaniu tego ustawienia Visual Studio .NET wstawi ponisze informacje do pliku konfiguracyjnego aplikacji:
<configuration>
<applicationSettings>
<TypizowaneUstawienia.Settings>
<setting name="UserDataFilePath" serializeAs="String">
<value>c:\MyFiles</value>
</setting>

58

Rozdzia 2: Jzyk Visual Basic

</TypizowaneUstawienia.Settings>
</applicationSettings>
</configuration>

Jednoczenie za kulisami Visual Studio skompiluje klas, ktra zawiera informacje o niestandardowym ustawieniu konfiguracyjnym. Teraz
z dowolnego miejsca w kodzie bdzie mona uzyska dostp do ustawienia wedug jego nazwy za porednictwem obiektu My.Settings. Oto kod,
ktry pobiera warto ustawienia o nazwie UserDataFilePath:
Dim path As String
path = My.Settings.UserDataFilePath

W .NET 2.0 ustawienia konfiguracyjne nie musz by acuchami.


Mona uywa innych serializowalnych typw danych, w tym liczb cakowitych i dziesitnych, dat i czasw (wystarczy wybra odpowiedni typ
z listy rozwijanej Type). Wartoci te s przeksztacane w tekst podczas
zapisu w pliku konfiguracyjnym, ale mona je pobra za porednictwem
obiektu My.Settings w odpowiednim formacie, bez analizy skadniowej!

A co

Klasa ustawie
konfiguracyjnych
jest dodawana do
wza My Project
i nosi nazw
Settings.Designer.
Aby j obejrze,
naley wybra
z menu Project
polecenie Show All Files.

z aktualizowaniem ustawie? W przykadzie UserFileDataPath wykorzystano ustawienie o zasigu aplikacji, ktre mona odczytywa w czasie dziaania programu, ale nie mona go modyfikowa. Jeli konieczna
jest aktualizacja ustawienia o zasigu aplikacji, trzeba rcznie zmodyfikowa plik konfiguracyjny (albo uy listy ustawie w Visual Studio).
Alternatyw jest utworzenie ustawie o zasigu uytkownika. W tym
celu wystarczy wybra pozycj User z listy rozwijanej Scope na licie
ustawie. Jeli ustawienie ma zasig uytkownika, warto ustawiona
w Visual Studio jest zapisywana jako warto domylna w pliku konfiguracyjnym, w katalogu aplikacji. Jednake zmiana tych ustawie powoduje utworzenie nowego pliku user.config i zapisanie go w katalogu
specyficznym dla biecego uytkownika (o nazwie c:\Documents and

Settings\[NazwaUytkownika]\Ustawienia lokalne\Dane aplikacji\[Nazwa


Firmy]\[UnikatowyKatalog]\[WersjaAplikacji]).
W razie uycia ustawie specyficznych dla uytkownika trzeba pamita o wywoaniu metody My.Settings.Save() w celu zapisania zmian.
W przeciwnym razie zmiany bd obowizywa tylko do momentu zaUywanie cile typizowanych ustawie konfiguracyjnych

59

mknicia aplikacji. Zwykle metod My.Settings.Save() wywouje si pod


koniec dziaania aplikacji.
Aby wyprbowa ustawienia o zasigu uytkownika, naley zmieni zasig ustawienia UserDataFilePath na User. Nastpnie naley utworzy
formularz z polem tekstowym (o nazwie txtFilePath) i dwoma przyciskami: jednym do pobierania ustawienia (cmdRefresh), a drugim do aktualizowania go (cmdUpdate). Oto odpowiednie procedury obsugi zdarze:
Private Sub cmdRefresh_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdRefresh.Click
txtFilePath.Text = My.Settings.UserDataFilePath
End Sub
Private Sub cmdUpdate_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdUpdate.Click
My.Settings.UserDataFilePath = txtFilePath.Text
End Sub

Aby zmiany obowizyway podczas nastpnego uruchomienia aplikacji,


konieczne jest utworzenie lub zaktualizowanie pliku user.config podczas
zamykania formularza:
Private Sub Form1_FormClosed(ByVal sender As Object, _
ByVal e As System.Windows.Forms.FormClosedEventArgs) _
Handles Me.FormClosed
My.Settings.Save()
End Sub

To ju cay kod, ktry trzeba doda do formularza. Teraz mona uruchomi aplikacj i sprawdzi, jak dziaa pobieranie biecego ustawienia
i zapisywanie nowego. Nastpnie mona poszuka pliku user.config, ktry
zawiera zmienione ustawienia biecego uytkownika.

Tworzenie klas generycznych

Jak utworzy klas


na tyle elastyczn,
aby moga dziaa
z dowolnym typem
obiektu, a jednoczenie w kadej sytuacji
mc ogranicza
przyjmowane
przez ni obiekty?
Rozwizaniem s
konstrukcje generyczne jzyka VB.

Programici czsto staj przed trudnym wyborem. Z jednej strony, bardzo wane jest tworzenie rozwiza uniwersalnych, ktre mona wielokrotnie wykorzystywa w rnych sytuacjach. Dlaczego na przykad
mielibymy tworzy klas CustomerCollection, ktra przyjmuje tylko
obiekty typu Customer, skoro moemy zaprojektowa klas Collection
zapewniajc dostp do obiektw dowolnego typu? Z drugiej strony kwestie wydajnoci i typizacji sprawiaj, e rozwizania uniwersalne s
mniej podane. Jeli na przykad uyjemy generycznej klasy .NET

60

Rozdzia 2: Jzyk Visual Basic

Collection do przechowywania obiektw Customer, to skd mamy wie-

dzie, czy przypadkiem nie wstawimy do kolekcji obiektu innego typu, co


pniej spowoduje trudne do wykrycia problemy?
Visual Basic 2005 i .NET 2.0 zapewniaj rozwizanie nazywane klasami generycznymi. S to klasy parametryzowane wedug typu. Innymi
sowy, umoliwiaj one zbudowanie szablonu obsugujcego dowolny
typ. Podczas tworzenia instancji klasy okrelamy, jakiego typu chcemy
uywa, i od tego momentu jestemy przywizani do wybranego typu.

Jak to zrobi?
Przykadem, ktry pokazuje przydatno konstrukcji generycznych, jest
klasa System.Collections.ArrayList. ArrayList uniwersalna, automatycznie skalowana kolekcja. Moe ona przechowywa zwyke obiekty
.NET albo obiekty zdefiniowane przez uytkownika. Aby byo to moliwe,
klasa ArrayList traktuje wszystkie elementy jak bazowy typ Object.
Problem polega na tym, e nie sposb narzuci adnych ogranicze na
dziaanie klasy ArrayList. Jeli, na przykad, chcemy uy klasy ArrayList
do przechowywania kolekcji obiektw Customer, nie moemy upewni
si, e jaki fragment kodu nie wstawi do niej acuchw, liczb cakowitych albo jakich innych obiektw, co pniej spowoduje problemy. Z tej
przyczyny programici czsto tworz wasne, cile typizowane klasy
kolekcji w rzeczywistoci biblioteka .NET jest wypeniona dziesitkami takich klas.
Konstrukcje generyczne rozwizuj ten problem. Za pomoc sowa kluczowego Of mona zadeklarowa klas, ktra dziaa z dowolnym typem
danych:
Public Class GenericList(Of ItemType)
' (tutaj kod klasy)
End Class

W tym przypadku tworzymy now klas o nazwie GenericList, ktra


moe dziaa z obiektami dowolnego typu. Kod kliencki musi jednak
okreli, jakiego typu bdzie uywa. W kodzie klasy odwoujemy si do
tego typu za pomoc sowa ItemType. Oczywicie, ItemType nie jest na-

Tworzenie klas generycznych

61

prawd typem to tylko parametr zastpujcy typ, ktry zostanie wybrany podczas tworzenia instancji obiektu GenericList.
Na listingu 2.2 pokazano kompletny kod prostej klasy listy, ktra kontroluje zgodno typw.
Listing 2.2. Kolekcja kontrolujca zgodno typw
Public Class GenericList(Of ItemType)
Inherits CollectionBase
Public Function Add(ByVal value As ItemType) As Integer
Return List.Add(value)
End Function
Public Sub Remove(ByVal value As ItemType)
List.Remove(value)
End Sub
Public ReadOnly Property Item(ByVal index As Integer) As ItemType
Get
' Odpowiedni element jest pobierany z obiektu List i jawnie
' rzutowany na odpowiedni typ, a nastpnie zwracany
Return CType(List.Item(index), ItemType)
End Get
End Property
End Class

Klasa GenericList jest nakadk na zwyk klas ArrayList, ktra jest dostpna za porednictwem waciwoci List bazowej klasy CollectionBase.
Klasa GenericList dziaa jednak inaczej ni ArrayList, poniewa oferuje cile typizowane metody Add() i Remove(), w ktrych wykorzystano zastpczy parametr ItemType.
Oto przykad uycia klasy GenericList do utworzenia kolekcji ArrayList,
ktra obsuguje tylko acuchy:
' Tworzymy instancj GenericList i wybieramy typ (w tym przypadku String)
Dim List As New GenericList(Of String)
' Dodajemy dwa acuchy
List.Add("niebieski")
List.Add("zielony")
' Nastpna instrukcja nie zadziaa, poniewa dodaje do kolekcji bdny typ.
' Nie mona automatycznie przeksztaci identyfikatora GUID w acuch.
' Prawd mwic, wiersz ten nie zostanie nigdy wykonany, poniewa kompilator
' wykryje problem i odmwi zbudowania aplikacji.
List.Add(Guid.NewGuid())

62

Rozdzia 2: Jzyk Visual Basic

Nie ma adnych ogranicze, jeli chodzi o parametryzowanie klasy.


W przykadzie GenericList jest tylko jeden parametr. Mona jednak atwo utworzy klas, ktra dziaa z dwoma lub trzema typami obiektw
i pozwala sparametryzowa kady z nich. Aby uy tej techniki, naley
oddzieli kady typ przecinkiem (midzy nawiasami na pocztku deklaracji klasy).
Rozwamy na przykad ponisz klas GenericHashTable, ktra pozwala zdefiniowa typ elementw kolekcji (ItemType), a take typ kluczy
uywanych do indeksowania tych elementw (KeyType):
Public Class GenericHashTable(Of ItemType, KeyType)
Inherits DictionaryBase
' (tutaj kod klasy)
End Class

Inn wan cech konstrukcji generycznych jest moliwo nakadania


ogranicze na parametry. Ograniczenia zawaj zakres typw obsugiwanych przez klas generyczn. Przypumy, e chcemy utworzy
klas obsugujc wycznie typy implementujce okrelony interfejs.
W tym celu najpierw musimy zadeklarowa typ lub typy akceptowane
przez klas, a nastpnie uy sowa kluczowego As, aby okreli klas
bazow, z ktrej typ musi si wywodzi, albo interfejs, ktry musi implementowa.
Oto przykad, ktry ogranicza elementy przechowywane w kolekcji GenericList do typw serializowalnych. Byoby to uyteczne, gdybymy chcieli
doda do klasy GenericList metod wymagajc serializacji, na przykad tak, ktra zapisywaaby wszystkie elementy listy w strumieniu:
Public Class SerializableList(Of ItemType As ISerializable)
Inherits CollectionBase
' (tutaj kod klasy)
End Class

A oto kolekcja, ktra moe zawiera obiekt dowolnego typu, pod warunkiem e wywodzi si on z klasy System.Windows.Forms.Control. Rezultatem jest kolekcja ograniczona do kontrolek, przypominajca t eksponowan przez waciwo Forms.Controls okna:
Public Class SerializableList(Of ItemType As Control)
Inherits CollectionBase
' (tutaj kod klasy)
End Class

Tworzenie klas generycznych

63

Czasem klasa generyczna musi mie moliwo tworzenia sparametryzowanych obiektw. Na przykad w klasie GenericList konieczne moe
by tworzenie instancji elementu, ktry ma by dodany do kolekcji. W takim przypadku trzeba uy ograniczenia New. Ograniczenie New zezwala
tylko na typy, ktre maj publiczny, bezargumentowy konstruktor i nie s
oznaczone jako MustInherit. Gwarantuje to, e kod bdzie mg tworzy
instancje typu. Oto kolekcja, ktra narzuca ograniczenie New:
Public Class GenericList(Of ItemType As New)
Inherits CollectionBase
' (tutaj kod klasy)
End Class

Warto te zauway, e mona definiowa dowolnie wiele ogranicze.


W tym celu naley umieci ich list w nawiasie klamrowym, jak w poniszym przykadzie:
Public Class GenericList(Of ItemType As {ISerializable, New})
Inherits CollectionBase
' (tutaj kod klasy)
End Class
Konstrukcje generyczne s wbudowane
w rodowisko CLR.
Oznacza to, e s
one obsugiwane we
wszystkich jzykach
.NET, cznie z C#.

Ograniczenia s wymuszone przez kompilator, wic naruszenie ograniczenia podczas korzystania z klasy generycznej uniemoliwi skompilowanie aplikacji.

A co
z innymi konstrukcjami generycznymi? Typw sparametryzowanych
mona uywa nie tylko w klasach, ale rwnie w strukturach, interfejsach, delegacjach, a nawet metodach. Wicej informacji jest dostpnych
pod hasem generics w pomocy MSDN. Przykady uycia zaawansowanych konstrukcji generycznych mona znale w artykule przegldowym
Microsoftu pod adresem http://www.msdn.net/library/en-us/dnvs05/html/
vb2005_generics.asp.
Nawiasem mwic, twrcy .NET Framework zdawali sobie spraw z przydatnoci kolekcji generycznych, wic utworzyli kilka gotowych kolekcji
na uytek programistw. Znajduj si one w przestrzeni nazw System.
Collections.Generic. S to midzy innymi:
List (prosta kolekcja podobna do przykadowej klasy GenericList);

64

Rozdzia 2: Jzyk Visual Basic

Dictionary (kolekcja typu nazwa-warto, w ktrej kady element


jest indeksowany przy uyciu klucza);
LinkedList (poczona lista, w ktrej kady element wskazuje nastpny);
Queue (kolekcja typu pierwszy na wejciu, pierwszy na wyjciu);
Stack (kolekcja typu ostatni na wejciu, pierwszy na wyjciu);
SortedList (kolekcja typu nazwa-warto, ktra stale pozostaje
posortowana).
Wikszo spord tych kolekcji powiela jedn z klas w przestrzeni nazw
System.Collections. Stare kolekcje pozostawiono w celu zachowania
zgodnoci.

Uywanie wartoci pustych


w prostych typach danych
Dziki obsudze konstrukcji generycznych .NET Framework moe zaoferowa kilka nowych funkcji. Jedn z nich generyczne, cile typizowane kolekcje opisano w poprzednim wiczeniu, Tworzenie klas
generycznych. Konstrukcje generyczne rozwizuj rwnie inne czsto
spotykane problemy, w tym obsug wartoci pustych w prostych typach
danych.

Czasem konieczne
jest reprezentowanie
danych, ktre mog
by nieobecne.
Umoliwiaj to nowe
typy danych VB .NET.

Jak to zrobi?
Warto pusta (w Visual Basicu identyfikowana przez sowo kluczowe
Nothing) jest specjalnym znacznikiem, ktry wskazuje, e dane s nieobecne. Wikszo programistw zna puste referencje do obiektw, ktre
wskazuj, e obiekt zdefiniowano, ale jeszcze go nie utworzono. Na przykad w poniszym kodzie obiekt FileStream zawiera pust referencj, poniewa nie zosta jeszcze utworzony za pomoc sowa kluczowego New:
Dim fs As FileStream
If fs Is Nothing
' Ten warunek jest zawsze speniony, poniewa
' nie utworzono jeszcze obiektu FileStream
Console.WriteLine("Obiekt zawiera pust referencj")
End If

Uywanie wartoci pustych w prostych typach danych

65

Podstawowe typy danych, takie jak liczby cakowite i acuchy, nie mog
zawiera wartoci pustych. Zmienne liczbowe s automatycznie inicjalizowane wartoci 0, zmienne logiczne wartoci False, zmienne
acuchowe acuchem pustym (""). W rzeczywistoci nawet jawne
ustawienie zmiennej typu prostego na Nothing spowoduje automatyczne przeksztacenie wartoci pustej (w 0, False lub ""), jak pokazuje
poniszy kod:
Dim j As Integer = Nothing
If j = 0 Then
' Ten warunek jest zawsze speniony, poniewa w przypadku liczb
cakowitych
' zachodzi automatyczna konwersja midzy wartoci Nothing a 0
Console.WriteLine("Zmienna cakowita nie moe zawiera wartoci
pustej, j = " & j)
End If

Czasem powoduje to problemy, poniewa nie da si odrni wartoci


zerowej od wartoci, ktrej nigdy nie podano. Wyobramy sobie, e piszemy kod, ktry pobiera z pliku tekstowego liczb zamwie zoonych
przez klienta. Pniej badamy t warto. Problem wystpuje wtedy, gdy
jest ona rwna zeru. Nie moemy stwierdzi, czy dane s prawidowe
(uytkownik nie zoy adnych zamwie), czy moe brakuje nam jakich informacji (nie udao si pobra wartoci albo biecy uytkownik
nie jest zarejestrowanym klientem).
Dziki obsudze konstrukcji generycznych .NET 2.0 oferuje rozwizanie
klas System.Nullable, ktra moe owija dowolny typ danych.
Podczas tworzenia instancji klasy Nullable okrelamy typ danych. Jeli
nie ustawimy wartoci, instancja ta bdzie zawiera pust referencj.
Moemy sprawdzi, czy tak jest w istocie, wywoujc metod Nullable.
HasType(), i pobra bazowy obiekt za porednictwem waciwoci
Nullable.Value.
Oto przykadowy kod tworzcy zmienn cakowit, ktra moe zawiera
warto pust:
Dim i As Nullable(Of Integer)
If Not i.HasValue Then
' Warunek jest speniony, poniewa zmiennej nie przypisano wartoci
Console.WriteLine("Zmienna i zawiera warto pust")
End If

66

Rozdzia 2: Jzyk Visual Basic

' Przypisujemy warto. Zauwamy, e trzeba j przypisa bezporednio


' zmiennej i,
' a nie i.Value. Waciwo i.Value jest przeznaczona tylko do odczytu i zawsze
' odzwierciedla biecy obiekt, jeli nie jest to Nothing.
i = 100
If i.HasValue Then
' Warunek jest speniony, poniewa obecnie zmienna zawiera warto (100)
Console.WriteLine("Zmienna cakowita i = " & i.Value)
End If

A co
z uywaniem klasy Nullable w poczeniu z typami referencyjnymi?
Cho nie jest to konieczne (poniewa typy referencyjne mog zawiera
pust referencj), to ma pewne zalety. Moemy uywa nieco czytelniejszej metody HasValue() zamiast testowa warto Nothing. Co najlepsze, moemy atwo dokona tej zmiany, poniewa klasa Nullable pozwala na niejawn konwersj midzy Nullable a typem bazowym.

Wicej informacji
Aby dowiedzie si wicej na temat klasy Nullable i jej implementacji,
naley zajrze pod haso Nullable class w pomocy MSDN.

Uywanie operatorw
w poczeniu z wasnymi obiektami
Kady programista VB dobrze zna operatory arytmetyczne suce do
dodawania (+), odejmowania (-), dzielenia (/) i mnoenia (*). Zwykle
operatory te s zarezerwowane dla liczbowych typw .NET i nie mona
uywa ich w poczeniu z innymi obiektami. Jednake w VB .NET 2.0
mona budowa obiekty, ktre obsuguj wszystkie te operatory (a take
operatory uywane do operacji logicznych i niejawnej konwersji typu).
Technika ta nie ma sensu w przypadku obiektw biznesowych, ale jest
niezwykle przydatna do modelowania struktur matematycznych, takich
jak wektory, macierze, liczby zespolone albo jak w poniszym przykadzie uamki.

Uywanie operatorw w poczeniu z wasnymi obiektami

Kto ma do posugiwania si toporn


skadni w rodzaju
ObjA.Subtract(ObjB)
w celu wykonania
prostych operacji na
wasnych obiektach?
Dziki przecianiu
operatorw mona
manipulowa takimi
obiektami rwnie
atwo jak zwykymi
liczbami.

67

Jak to zrobi?
Aby przeciy operator w Visual Basicu 2005, trzeba utworzy specjaln metod operatorow w klasie (lub strukturze). Metod t deklaruje si
przy uyciu sw kluczowych Public Shared Operator, po ktrych nastpuje symbol operatora (na przykad +).
WS KAZWK A
Przecianie operatora to po prostu definiowanie, co robi operator,
kiedy uywamy go w poczeniu z konkretnym typem obiektu. Innymi sowy, kiedy przeciamy operator + klasy Fraction, informujemy .NET, co naley zrobi, gdy kod dodaje do siebie dwa
obiekty Fraction.

Oto przykadowa metoda operatorowa, ktra dodaje obsug operatora


dodawania (+):
Public Shared Operator(ObjA As MyClass, objB As MyClass) As MyClass
' (tutaj kody klasy)
End Operator

Kada metoda operatorowa przyjmuje dwa parametry, ktre reprezentuj wartoci po obu stronach operatora. W zalenoci od operatora i klasy
kolejno moe mie znaczenie (jak w przypadku dzielenia).
Kiedy zdefiniujemy operator, kompilator VB bdzie wywoywa nasz kod
podczas wykonywania kadej instrukcji, ktra uywa operatora na obiekcie danej klasy. Na przykad kompilator przeksztaci kod:
ObjC = ObjA + ObjB

do nastpujcej postaci:
ObjC = MyClass.Operator+(ObjA, ObjB)

Na listingu 2.3 pokazano, jak przeciy operatory arytmetyczne Visual


Basica na uytek klasy Fraction. Kady obiekt Fraction skada si
z dwch czci: licznika i mianownika (tzw. gry i dou uamka). Kod
klasy Fraction przecia operatory +, -, * oraz /, umoliwiajc wykonywanie oblicze uamkowych bez przeksztacania liczb w wartoci
dziesitne, a zatem bez utraty precyzji.

68

Rozdzia 2: Jzyk Visual Basic

Listing 2.3. Przecianie operatorw arytmetycznych w klasie Fraction


Public Structure Fraction
' Dwie czci uamka
Public Denominator As Integer
Public Numerator As Integer
Public Sub New(ByVal numerator As Integer, ByVal denominator As Integer)
Me.Numerator = numerator
Me.Denominator = denominator
End Sub
Public Shared Operator +(ByVal x As Fraction, ByVal y As Fraction) _
As Fraction
Return Normalize(x.Numerator * y.Denominator + _
y.Numerator * x.Denominator, x.Denominator * y.Denominator)
End Operator
Public Shared Operator -(ByVal x As Fraction, ByVal y As Fraction) _
As Fraction
Return Normalize(x.Numerator * y.Denominator - _
y.Numerator * x.Denominator, x.Denominator * y.Denominator)
End Operator
Public Shared Operator *(ByVal x As Fraction, ByVal y As Fraction) _
As Fraction
Return Normalize(x.Numerator * y.Numerator, _
x.Denominator * y.Denominator)
End Operator
Public Shared Operator /(ByVal x As Fraction, ByVal y As Fraction) _
As Fraction
Return Normalize(x.Numerator * y.Denominator, _
x.Denominator * y.Numerator)
End Operator
' Redukcja uamka
Private Shared Function Normalize(ByVal numerator As Integer, _
ByVal denominator As Integer) As Fraction
If (numerator <> 0) And (denominator <> 0) Then
' Poprawianie znakw
If denominator < 0 Then
denominator *= -1
numerator *= -1
End If
Dim divisor As Integer = GCD(numerator, denominator)
numerator \= divisor
denominator \= divisor
End If
Return New Fraction(numerator, denominator)
End Function

Uywanie operatorw w poczeniu z wasnymi obiektami

69

' Zwracanie najwikszego wsplnego dzielnika przy uyciu algorytmu


' Euklidesa
Private Shared Function GCD(ByVal x As Integer, ByVal y As Integer) _
As Integer
Dim temp As Integer
x = Math.Abs(x)
y = Math.Abs(y)
Do While (y <> 0)
temp = x Mod y
x = y
y = temp
Loop
Return x
End Function
' Przeksztacanie uamka w posta dziesitn
Public Function GetDouble() As Double
Return CType(Me.Numerator, Double) / _
CType(Me.Denominator, Double)
End Function
' Pobieranie acucha reprezentujcego uamek
Public Overrides Function ToString() As String
Return Me.Numerator.ToString & "/" & Me.Denominator.ToString
End Function
End Structure

Aplikacja konsoli pokazana na listingu 2.4 przeprowadza szybki test


klasy Fraction. Dziki przecianiu operatorw liczba pozostaje w postaci
uamkowej i nie dochodzi do utraty precyzji.
Listing 2.4. Test klasy Fraction
Module FractionTest
Sub Main()
Dim f1 As New Fraction(2, 3)
Dim f2 As New Fraction(1, 4)
Console.WriteLine("f1 = " & f1.ToString())
Console.WriteLine("f2 = " & f2.ToString())
Dim f3 As Fraction
f3 = f1 + f2
' f3 obecnie wynosi 11/12
Console.WriteLine("f1 + f2 = " & f3.ToString())
f3 = f1 / f2
' f3 obecnie wynosi 8/3
Console.WriteLine("f1 / f2 = " & f3.ToString())

70

Rozdzia 2: Jzyk Visual Basic

f3 = f1 - f2
' f3 obecnie wynosi 5/12
Console.WriteLine("f1 - f2 = " & f3.ToString())
f3 = f1 * f2
' f3 obecnie wynosi 1/6
Console.WriteLine("f1 * f2 = " & f3.ToString())
Console.ReadLine()
End Sub
End Module

Po uruchomieniu tej aplikacji pojawi si nastpujce wyniki:


f1
f2
f1
f1
f1
f1

=
=
+
/
*

2/3
1/4
f2 =
f2 =
f2 =
f2 =

11/12
8/3
5/12
1/6

Parametry i warto zwrotna metody operatorowej zwykle s tego samego typu. Mona jednak utworzy kilka wersji metody operatorowej,
aby uywa obiektw w wyraeniach z rnymi typami.

A co
z przecianiem operatorw w innych typach danych? Istniej klasy,
ktre s naturalnymi kandydatami do przeciania operatorw. Oto kilka
przykadw:
klasy matematyczne, ktre modeluj wektory, macierze, liczby zespolone lub tensory;
klasy finansowe, ktre zaokrglaj obliczenia do najbliszego grosza
i obsuguj rne typy walut;
klasy miar, ktre uywaj jednostek nieregularnych, na przykad
cali i stp.

Wicej informacji
Aby dowiedzie si wicej o skadni przeciania operatorw oraz o wszystkich operatorach, ktre mona przecia, naley zajrze pod haso indeksu Operator procedures w pomocy MSDN.

Uywanie operatorw w poczeniu z wasnymi obiektami

71

Niektre klasy s tak


due, e przechowywanie ich definicji
w jednym pliku jest
niewygodne. Za
pomoc nowego
sowa kluczowego
Partial mona
podzieli klas na kilka
oddzielnych plikw.

Dzielenie klasy na wiele plikw


Jeli otworzymy klas .NET 2.0 Windows Forms, zauwaymy, e nie ma
w niej automatycznie wygenerowanego kodu! Aby zrozumie, gdzie podzia si ten kod, trzeba zapozna si z funkcj klas czciowych, ktra
umoliwia dzielenie klasy na kilka czci.

Jak to zrobi?
Za pomoc sowa kluczowego Partial mona podzieli klas na dowoln liczb czci. Wystarczy zdefiniowa t sam klas w wicej ni jednym miejscu. Oto przykad, w ktrym klas SampleClass zdefiniowano
w dwch czciach:
Partial Public Class SampleClass
Public Sub MethodA()
Console.WriteLine("Wywoano metod A")
End Sub
End Class
Partial Public Class SampleClass
Public Sub MethodB()
Console.WriteLine("Wywoano metod B")
End Sub
End Class

W tym przykadzie deklaracje znajduj si w tym samym pliku, jedna


za drug. Nic jednak nie stoi na przeszkodzie, aby umieci dwie czci
klasy SampleClass w rnych plikach kodu rdowego nalecych do
tego samego projektu (jedyne ograniczenie polega na tym, e nie mona
zdefiniowa dwch czci klasy w oddzielnych podzespoach albo rnych przestrzeniach nazw).
Podczas kompilowania aplikacji zawierajcej powyszy kod Visual Studio
wyszuka kad cz SampleClass i poczy j w kompletn klas z dwoma
metodami, MethodA() i MethodB(). Mona uywa obu tych metod:
Dim Obj As New SampleClass()
Obj.MethodA()
Obj.MethodB()

Klasy czciowe nie pomagaj w rozwizywaniu problemw programistycznych, ale przydaj si do dzielenia bardzo duych, nieporcznych
klas. Oczywicie, sama obecno duych klas w aplikacji moe wiadczy
72

Rozdzia 2: Jzyk Visual Basic

o tym, e programista le rozoy problem na czynniki, a w takim przypadku lepiej jest podzieli kod na odrbne, a nie czciowe klasy. Jednym
z kluczowych zastosowa klas czciowych w .NET jest ukrywanie kodu
generowanego automatycznie przez Visual Studio, ktry w starszych
wersjach by widoczny, co przeszkadzao niektrym programistom VB.
Na przykad podczas budowania formularza .NET w Visual Basicu 2005
kod obsugi zdarze jest umieszczany w pliku kodu rdowego formularza, ale kod, ktry tworzy poszczeglne kontrolki i czy je z procedurami obsugi zdarze, jest niewidoczny. Aby go zobaczy, trzeba wybra
z menu Project polecenie Show All Files. Plik z brakujc czci klasy
pojawi si wwczas w oknie Solution Explorer. Jeli formularz nosi nazw Form1, to skada si na niego plik Form1.vb, ktry zawiera kod pisany
przez programist, oraz plik Form1.Designer.vb, ktry zawiera automatycznie wygenerowan cz.

A co
z uywaniem sowa kluczowego Partial w poczeniu ze strukturami? To dziaa, ale nie mona tworzy czciowych interfejsw, wylicze ani adnych innych konstrukcji programistycznych .NET.

Wicej informacji
Wicej informacji o klasach czciowych mona znale pod hasem indeksu Partial keyword w pomocy MSDN.

Rozszerzanie przestrzeni nazw My


Obiekty My nie s zdefiniowane w jednym miejscu. Niektre z nich pochodz od klas zdefiniowanych w przestrzeni nazw Microsoft.VisualBasic.MyServices, a inne s generowane automatycznie w miar dodawania formularzy, usug WWW, ustawie konfiguracyjnych i osadzonych zasobw do projektu aplikacji. Programista moe jednak rozszerzy przestrze nazw My o wasne skadniki (na przykad przydatne
obliczenia oraz zadania specyficzne dla aplikacji).

Rozszerzanie przestrzeni nazw My

Niektrzy tak czsto


uywaj obiektw
My, e chcieliby
dostosowa je do
wasnych potrzeb.
VB 2005 umoliwia
doczenie wasnych
klas do przestrzeni
nazw My.

73

Jak to zrobi?
Aby doczy now klas do hierarchii obiektw My, wystarczy uy bloku
Namespace z nazw My. Na przykad poniszy kod definiuje now klas
BusinessFunctions, ktra zawiera specyficzne dla firmy funkcje przeznaczone do generowania identyfikatorw (poprzez poczenie nazwy
klienta z identyfikatorem GUID):
Namespace My
Public Class BusinessFunctions
Public Shared Function GenerateNewCustomerID( _
ByVal name As String) As String
Return name & "_" & Guid.NewGuid.ToString()
End Function
End Class
End Namespace

Po utworzeniu obiektu BusinessFunctions mona uywa go w aplikacji


tak samo jak dowolnego innego obiektu My. Na przykad ponisza instrukcja wywietla nowy identyfikator klienta:
Console.WriteLine(My.BusinessFunctions.GenerateNewCustomerID("matthew"))

Zwrmy uwag, e nowe klasy My musz uywa wspdzielonych metod


i waciwoci, poniewa obiekty My nie s konkretyzowane automatycznie. Gdybymy uyli zwykych skadowych instancyjnych, musielibymy
sami tworzy obiekt My i nie moglibymy manipulowa nim przy uyciu
tej samej skadni. Innym rozwizaniem jest utworzenie moduu w przestrzeni nazw My, poniewa wszystkie metody i waciwoci w module s
wspdzielone.
Skadowe wspdzielone to skadowe,
ktre s zawsze
dostpne za porednictwem nazwy
klasy, nawet jeli
obiekt nie zosta
utworzony. W razie
uycia zmiennej
wspdzielonej
istnieje tylko jedna
kopia tej zmiennej,
globalna dla caej
aplikacji.

Mona rwnie rozszerza niektre spord istniejcych obiektw


My dziki klasom czciowym. W ten sposb mona na przykad doda nowe informacje do obiektu My.Computer albo nowe procedury do
obiektu My.Application. Wymaga to nieco innego podejcia. Waciwo My.Computer eksponuje instancj obiektu MyComputer. Waciwo
My.Application eksponuje instancj obiektu MyApplication. Aby wic
rozszerzy ktr z tych klas, trzeba utworzy klas czciow o odpowiedniej nazwie i doda do niej odpowiednie skadowe. Naley rwnie
zadeklarowa t klas przy uyciu sowa kluczowego Friend, aby dopasowa j do istniejcej klasy.

74

Rozdzia 2: Jzyk Visual Basic

Oto przykad rozszerzania obiektu My.Application o metod, ktra


sprawdza, czy dostpna jest zaktualizowana wersja programu:
Namespace My
Partial Friend Class MyApplication
Public Function IsNewVersionAvailable() As Boolean
' Zwykle numer najnowszej wersji aplikacji byby odczytywany
' z usugi WWW albo jakiego innego zasobu.
' W tym przykadzie jest zakodowany "na sztywno"
Dim LatestVersion As New Version(1, 2, 1, 1)
Return Application.Info.Version.CompareTo(LatestVersion)
End Function
End Class

Teraz moemy wykorzysta t metod:


If My.Application.IsNewVersionAvailable()
Console.WriteLine("Dostpna jest nowsza wersja")
Else
Console.WriteLine("To jest najnowsza wersja")
End If

A co
z uywaniem rozszerze My w wielu aplikacjach? Klasy My moemy
traktowa dokadnie tak samo, jak inne przydatne klasy, ktre chcemy
ponownie wykorzysta w innej aplikacji. Innymi sowy, moemy utworzy projekt biblioteki klas, doda do niego kilka rozszerze My i skompilowa go do postaci biblioteki DLL. Nastpnie moemy odwoywa si
do tej biblioteki DLL w innych aplikacjach.
Oczywicie, pomimo tego, co mogliby twierdzi entuzjaci Microsoftu,
taki sposb rozszerzania przestrzeni nazw My ma dwa potencjalnie niebezpieczne aspekty:
Trudniejsze staje si wykorzystanie komponentu w innych jzykach.
Na przykad jzyk C# nie obsuguje przestrzeni nazw My. Cho
mona uywa niestandardowego obiektu My w aplikacji C#, jest to
duo mniej wygodne.
Uywanie przestrzeni nazw My oznacza rezygnacj z jednej spord
najwikszych zalet przestrzeni nazw unikania konfliktw nazewniczych. Rozwamy na przykad dwie firmy, ktre tworz komponenty przeznaczone do rejestrowania zdarze. Gdyby firmy uyRozszerzanie przestrzeni nazw My

75

way zalecanego standardu nazewniczego przestrzeni nazw .NET


(NazwaFirmy.NazwaAplikacji.NazwaKlasy), komponenty najprawdopodobniej nie miayby takich samych w peni kwalifikowanych nazw;
jeden mgby nazywa si Acme.SuperLogger.Logger, a drugi
ComponentTech.LogMagic.Logger. Gdyby jednak oba komponenty rozszerzay obiekt My, mogyby uywa takiej samej nazwy (na przykad My.Application.Logger). W rezultacie nie mona byoby wykorzysta ich obu w tej samej aplikacji.
Nowe sowo kluczowe
Continue Visual Basica
umoliwia szybkie
wyjcie ze skomplikowanego bloku
kodu i przejcie do
nastpnej iteracji ptli.

Przechodzenie do nastpnej iteracji ptli


Visual Basic oferuje kilka instrukcji kontroli przepywu, ktre pozwalaj
sterowa kolejnoci wykonywania kodu. Mona na przykad uy sowa
kluczowego Return, aby wyj z funkcji, albo sowa Exit, aby zakoczy
ptl. Jednake przed wersj VB 2005 nie byo sposobu przejcia do nastpnej iteracji ptli.

Jak to zrobi?
Instrukcja Continue to jeden z tych mechanizmw jzykowych, ktre pocztkowo wydaj si mao istotne, ale z czasem okazuj si bardzo przydatne. Instrukcja Continue ma trzy wersje: Continue For, Continue Do
i Continue While, ktrych uywa si z rnymi typami ptli (For ... Next,
Do ... Loop oraz While ... End While).
Aby zrozumie, jak dziaa instrukcja Continue, przeanalizujmy poniszy kod:
For i = 1 To 1000
If i Mod 5 = 0 Then
' (kod zadania A)
Continue For
End If
' (kod zadania B)
Next

Ptla ta wykonuje si 1000 razy, stopniowo zwikszajc warto licznika i. Kiedy licznik i jest podzielny przez 5, wykonywany jest kod zadania A. Nastpnie instrukcja Continue For powoduje zwikszenie licznika
i wznowienie wykonywania od pocztku ptli, z pominiciem kodu zadania B.
76

Rozdzia 2: Jzyk Visual Basic

W tym przykadzie instrukcja Continue nie jest waciwie potrzebna,


poniewa mona atwo przepisa kod w nastpujcy sposb:
For i = 1 To 1000
If i Mod 5 = 0 Then
' (kod zadania A)
Else
' (kod zadania B)
End If
Next

Jest to jednak znacznie trudniejsze, gdy trzeba wykona kilka rnych


testw. Aby przekona si o zaletach instrukcji Continue, naley rozway bardziej skomplikowany (i realistyczny) przykad.
Na listingu 2.5 pokazano ptl, ktra przetwarza tablic sw. Program
analizuje kade sowo i ustala, czy jest ono puste, czy te skada si
z liter lub cyfr. Jeli speniony jest jeden z tych warunkw (na przykad
sowo skada si z liter), trzeba przej do nastpnego sowa bez wykonywania nastpnego testu. Aby osign to bez uycia instrukcji Continue,
trzeba zastosowa zagniedone ptle, co zmniejsza czytelno kodu.
Listing 2.5. Analizowanie acucha bez uycia instrukcji Continue
' Definiujemy zdanie
Dim Sentence As String = "Kocowy wynik oblicze to 433."
' Przeksztacamy zdanie w tablic sw
Dim Delimiters() As Char = {" ", ".", ","}
Dim Words() As String = Sentence.Split(Delimiters)
' Badamy kade sowo
For Each Word As String In Words
' Sprawdzamy, czy sowo jest puste
If Word <> "" Then
Console.Write("'" + Word + "'" & vbTab & "= ")
' Sprawdzamy, czy sowo skada si z liter
Dim AllLetters As Boolean = True
For Each Character As Char In Word
If Not Char.IsLetter(Character) Then
AllLetters = False
End If
Next
If AllLetters Then
Console.WriteLine("sowo")
Else
' Jeli sowo nie skada si z liter,
' sprawdzamy, czy skada si z cyfr

Przechodzenie do nastpnej iteracji ptli

77

Dim AllNumbers As Boolean = True


For Each Character As Char In Word
If Not Char.IsDigit(Character) Then
AllNumbers = False
End If
Next
If AllNumbers Then
Console.WriteLine("liczba")
Else
' Jeli sowo nie skada si z samych liter albo cyfr,
' zakadamy, e zawiera ich kombinacj (albo inne znaki)
Console.WriteLine("mieszane")
End If
End If
End If
Next

Teraz rozwamy wersj z listingu 2.6, w ktrej uyto instrukcji Continue,


aby dziaanie programu byo bardziej zrozumiae.
Listing 2.6. Analizowanie acucha przy uyciu instrukcji Continue
' Definiujemy zdanie
Dim Sentence As String = "Kocowy wynik oblicze to 433."
' Przeksztacamy zdanie w tablic sw
Dim Delimiters() As Char = {" ", ".", ","}
Dim Words() As String = Sentence.Split(Delimiters)
' Badamy kade sowo
For Each Word As String In Words
' Sprawdzamy, czy sowo jest puste
If Word = "" Then Continue For
Console.Write("'" + Word + "'" & vbTab & "= ")
' Sprawdzamy, czy sowo skada si z liter
Dim AllLetters As Boolean = True
For Each Character As Char In Word
If Not Char.IsLetter(Character) Then
AllLetters = False
End If
Next
If AllLetters Then
Console.WriteLine("sowo")
Continue For
End If
' Jeli sowo nie skada si z liter,
' sprawdzamy, czy skada si z cyfr
Dim AllNumbers As Boolean = True
For Each Character As Char In Word
If Not Char.IsDigit(Character) Then
AllNumbers = False
End If

78

Rozdzia 2: Jzyk Visual Basic

Next
If AllNumbers Then
Console.WriteLine("liczba")
Continue For
End If
' Jeli sowo nie skada si z samych liter albo cyfr,
' zakadamy, e zawiera ich kombinacj (albo inne znaki)
Console.WriteLine("mieszane")
Next

A co
z uyciem instrukcji Continue w zagniedonej ptli? Jest to moliwe.
Jeli zagniedzimy ptl For w ptli Do, bdziemy mogli uy instrukcji
Continue For, aby przej do nastpnej iteracji wewntrznej ptli, albo
instrukcji Continue Do, aby przej do nastpnej iteracji zewntrznej
ptli. Technika ta dziaa take w odwrotnej sytuacji (ptla Do wewntrz
ptli For), ale nie w przypadku dwch zagniedonych ptli tego samego
typu. W takiej sytuacji nie da si jednoznacznie odwoa do zewntrznej
ptli, wic instrukcja Continue zawsze dotyczy ptli wewntrznej.

Wicej informacji
Szczegowe informacje o instrukcji Continue mona znale pod hasem indeksu continue statement w pomocy MSDN.

Automatyczne usuwanie obiektw


W rodowisku .NET trzeba zwraca szczegln uwag na to, aby obiekty
uywajce niezarzdzanych zasobw (na przykad uchwytw plikw,
pocze z bazami danych i kontekstw graficznych) zwalniay je natychmiast, kiedy bdzie to moliwe. Obiekty tego typu powinny implementowa interfejs IDisposable i udostpnia metod Dispose(), ktr
mona wywoa w celu natychmiastowego zwolnienia zasobw.
Jedyny problem z t technik polega na tym, e trzeba pamita o wywoaniu metody Dispose() (albo innej metody wywoujcej Dispose(),
na przykad Close()). VB 2005 oferuje nowe zabezpieczenie, ktre gwarantuje wywoanie metody Dispose() instrukcj Using.

Automatyczne usuwanie obiektw

Jak unikn
pozostawiania
w pamici obiektw,
ktre zajmuj zasoby
a do momentu,
w ktrym wyszuka
je odmiecacz?
Dziki instrukcji
Using mona upewni
si, e obiekty
zostan usunite
we waciwym
momencie.

79

Jak to zrobi?
Instrukcji Using uywa si w strukturze bloku. W pierwszym wierszu
bloku Using naley okreli usuwalny obiekt. Czsto w tym samym
momencie tworzy si obiekt za pomoc sowa kluczowego New. Nastpnie w bloku Using naley napisa kod, ktry uywa usuwalnego obiektu.
Oto krtki fragment kodu, ktry tworzy nowy plik i zapisuje w nim dane:
Using NewFile As New System.IO.StreamWriter("c:\MojPlik.txt")
NewFile.WriteLine("To jest wiersz 1")
NewFile.WriteLine("To jest wiersz 2")
End Using
' Plik jest zamykany automatycznie
' Obiekt NewFile w tym miejscu jest ju niedostpny

W tym przykadzie natychmiast po opuszczeniu bloku Using wywoywana jest metoda Dispose() obiektu NewFile, co powoduje zwolnienie
uchwytu pliku.

A co
z bdami wystpujcymi w bloku Using? Na szczcie .NET zwalnia
zasb bez wzgldu na sposb wyjcia z bloku Using, nawet w przypadku
nieobsuonego wyjtku.
Instrukcji Using mona uywa w poczeniu ze wszystkimi usuwalnymi
obiektami, na przykad:
plikami (w tym FileStream, StreamReader i StreamWriter);
poczeniami z baz danych (w tym SqlConnection, OracleConnection
i OleDbConnection);
poczeniami sieciowymi (w tym TcpClient, UdpClient, NetworkStream,
FtpWebResponse, HttpWebResponse);
grafik (w tym Image, Bitmap, Metafile, Graphics).

Wicej informacji
Szczegowe informacje o instrukcji Using mona znale pod hasem
indeksu Using block w pomocy MSDN.

80

Rozdzia 2: Jzyk Visual Basic

Ochrona waciwoci
przy uyciu rnych poziomw dostpu
Wikszo waciwoci zawiera procedur Get (ktra umoliwia pobieranie wartoci waciwoci) oraz procedur Set (ktra umoliwia okrelenie nowej wartoci waciwoci). W poprzednich wersjach Visual Basica poziom dostpu do obu procedur musia by jednakowy. W VB 2005
mona zabezpieczy waciwo, przypisujc procedurze Set niszy poziom dostpu ni procedurze Get.

W przeszoci nie
dao si utworzy
waciwoci,
ktra moga by
odczytywana
przez kadego,
ale aktualizowana
tylko przez aplikacj.
VB 2005 wreszcie
poluzowuje reguy
i oferuje wiksz
elastyczno.

Jak to zrobi?
VB rozrnia trzy poziomy dostpu. W kolejnoci od najmniej do najbardziej ograniczonego s to:
Public (element dostpny dla wszystkich klas we wszystkich podzespoach);
Friend (element dostpny dla wszystkich klas w biecym podzespole);
Private (element dostpny tylko dla kodu w tej samej klasie).
Wyobramy sobie, e tworzymy komponent DLL, ktry bdzie uywany
przez inn aplikacj. Zawiera on waciwo Status, ktra bdzie odczytywana przez aplikacj klienck, wic deklarujemy j jako publiczn:
Public Class ComponentClass
Private _Status As Integer
Public Property Status() As Integer
Get
Return _Status
End Get
Set(ByVal value As Integer)
_Status = value
End Set
End Property
End Class

Problem w tym, e poziom dostpu przypisany waciwoci Status pozwala klientowi na jej zmian, co nie ma sensu. Waciwo Status
mogaby by przeznaczona tylko do odczytu (w tym celu naleaoby pomin procedur Set), ale wtedy nie mogyby jej zmienia inne klasy,
ktre stanowi cz aplikacji i znajduj si w tym samym podzespole.
Ochrona waciwoci przy uyciu rnych poziomw dostpu

81

Rozwizaniem jest przypisanie procedurze Set poziomu dostpu Friend.


Oto, jak powinien wyglda kod (jedyn zmian wyrniono pogrubion
czcionk):
Public Property Status() As Integer
Get
Return _Status
End Get
Friend Set(ByVal value As Integer)
_Status = value
End Set
End Property

A co
z waciwociami przeznaczonymi tylko do odczytu lub tylko do zapisu?
Rne poziomy dostpu nie pomog, jeli potrzebna jest waciwo
przeznaczona tylko do odczytu (na przykad warto obliczana) albo tylko do zapisu (na przykad haso, ktre po ustawieniu nie powinno pozostawa dostpne). W celu utworzenia waciwoci przeznaczonej tylko
do odczytu naley doda sowo kluczowe ReadOnly do deklaracji waciwoci (tu po sowie kluczowym okrelajcym poziom dostpu) i usun
procedur Set. W celu utworzenia waciwoci przeznaczonej tylko do
zapisu naley usun procedur Get i doda sowo kluczowe WriteOnly.
Te sowa kluczowe nie s niczym nowym byy dostpne ju w Visual
Basicu .NET 1.0.
Nowe operatory
logiczne umoliwiaj
czenie wielu warunkw i pisanie bardziej
zwartego kodu.

Testowanie kolejnych czci


wyraenia warunkowego
W poprzednich wersjach Visual Basica istniay dwa operatory logiczne:
And i Or. W Visual Basicu 2005 wprowadzono dwa dodatkowe operatory:
AndAlso oraz OrElse. Dziaaj one tak samo jak And i Or, ale pozwalaj
oszacowa tylko jedn cz dugiego wyraenia warunkowego.

Jak to zrobi?
W wielu programach trzeba oszacowa kilka warunkw z rzdu. Czsto
najpierw sprawdzamy, czy obiekt nie jest pusty, a nastpnie badamy
jedn z jego waciwoci.
82

Rozdzia 2: Jzyk Visual Basic

W tym celu musimy uywa zagniedonych blokw If, jak w poniszym przykadzie:
If Not MyObject Is Nothing Then
If MyObject.Value > 10 Then
' (robimy co)
End If
End If

Byoby mio poczy te dwa warunki w jednym wierszu:


If Not MyObject Is Nothing And MyObject.Value > 10 Then
' (robimy co)
End If

Niestety, to nie zadziaa, poniewa VB zawsze testuje oba warunki. Innymi sowy, nawet jeli MyObject jest rwny Nothing, VB sprawdzi
drugi warunek i sprbuje pobra waciwo MyObject.Value, co spowoduje wyjtek NullReferenceException.
W Visual Basicu 2005 rozwizano ten problem dziki sowom kluczowym AndAlso i OrElse. Kiedy uywamy tych operatorw, Visual Basic
nie testuje drugiego warunku, jeli pierwszy nie jest speniony. Oto poprawiony kod:
If Not MyObject Is Nothing AndAlso MyObject.Value > 10 Then
' (robimy co)
End If

A co
z innymi ulepszeniami jzyka? W tym rozdziale przedstawiono najwaniejsze innowacje w jzyku VB. Warto jednak wspomnie o kilku
innych nowociach, ktre nie zostay tu opisane:
Sowo kluczowe IsNot pozwala uproci niezgrabn skadni. Dziki
niemu mona zastpi konstrukcj If Not x Is Nothing rwnowan instrukcj If x IsNot Nothing.
Za pomoc funkcji TryCast() mona nieco przyspieszy rzutowanie
typw. Dziaa ona tak jak funkcje CType() lub DirectCast(), z jednym
wyjtkiem jeli obiektu nie mona przeksztaci w dany typ,
zwracana jest pusta referencja. Zamiast wic sprawdza typ obiektu,
a potem go rzutowa, mona od razu uy funkcji TryCast(), a nastpnie sprawdzi, czy zwrcia ona rzeczywist referencj do obiektu.
Testowanie kolejnych czci wyraenia warunkowego

83

Zmienne cakowite bez znaku umoliwiaj przechowywanie wartoci,


ktre nie mog by ujemne. Ograniczenie to oszczdza pami, pozwalajc na przechowywanie wikszych liczb. Liczby bez znaku zawsze byy obsugiwane przez .NET Framework, ale obecnie VB 2005
zawiera odpowiednie sowa kluczowe (UInteger, ULong i UShort).

84

Rozdzia 2: Jzyk Visual Basic

You might also like