Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
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
Spis treci
Spis treci
Spis treci
ROZDZIA 2
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
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
48
My.User
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.
49
50
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.).
51
Za pomoc obiektu
My.Application
mona pobra
informacje o biecej
wersji aplikacji,
jej pooeniu
oraz parametrach
uytych do jej
uruchomienia.
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
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.
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")>
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
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
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
55
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
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.
Tworzenie ustawie
konfiguracyjnych
w oknie projektu
aplikacji.
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.
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
</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
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
59
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.
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
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
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
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
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
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
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
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
66
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.
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.
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)
68
69
70
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
=
=
+
/
*
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.
71
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
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
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.
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
74
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
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
77
78
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.
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
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
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.
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
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
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
84