|
ZaΦßteΦnφk |
PokroΦil² |
Profesionßl |
|||||
|
|
|
||||||
┌vod
do sv∞ta .NET /8. dφl Modernφ technologie
v²voje softwaru |
||||||||
|
|
Budete pot°ebovat
p°ibli₧n∞ 95 minut |
|
OperaΦnφ systΘm
pou₧it² v p°φsp∞vku: Windows 2000 V²vojovΘ nßstroje:
Visual Basic .NET |
||||
|
Vß₧enφ Φtenß°i,
ji₧ osm²m dφlem pokraΦuje vßÜ oblφben² serißl
o p°edstavovßnφ programovacφho jazyka Visual Basic .NET. Nabφdka dneÜnφ Φßsti
bude vskutku v²teΦnß. Nejprve se podφvßme na praktickou ukßzku prßce dvou
zp∙sob∙ p°edßvßnφ argument∙, a potΘ se budeme soust°edit na pochopenφ konstant
a enumeraΦnφch typ∙. Zßv∞r bude pat°it prezentaci mo₧nostφ voleb Option
Explicit a Option Strict.
Obsah |
Praktickß ukßzka prßce dvou variant
p°edßvßnφ argument∙
Pokud jste absolvovali naÜe p°edchozφ sezenφ,
u₧ vφte, co se ukr²vß pod pojmy argument a parametr. Rovn∞₧ tak vφte, co je to
funkce a jak ji pou₧φt. Jak jsme si °ekli, argumenty lze p°edßvat p°φsluÜn²m
parametr∙m bu∩ odkazem nebo hodnotou. Jenom pro rychlΘ zopakovßnφ si
p°ipome≥me, ₧e p°i p°edßvßnφ argument∙ hodnotou je volanΘ procedu°e nebo funkci
p°edßna pouze kopie skuteΦnΘho argumentu, a tak, i kdy₧ se bude tato procedura
sna₧it sebevφc, nikdy se jφ nepoda°φ zm∞nit hodnotu skuteΦnΘho argumentu. Na
druhΘ stran∞, p°i p°edßvßnφ argument∙ odkazem je situace zcela jinß.
V tomto p°φpad∞ je toti₧ volanΘ procedu°e p°edßn ukazatel na pam∞¥ovΘ
mφsto, na kterΘm se skuteΦn² argument nachßzφ. Proto₧e procedura ävφô, kde je
ulo₧ena hodnota, je schopna tuto hodnotu snadno modifikovat. Dobrß, teorii jsme
probrali a te∩ se spoleΦn∞ vrhn∞me na praktickou demonstraci. Celou situaci si
ukß₧eme na nφ₧e uvedenΘm programovΘm k≤du t°φdy formulß°e Form1:
Public Class Form1
ááá Inherits
System.Windows.Forms.Form
Windows Form Designer generated code
áá
ááá Private
Sub Button1_Click(ByVal
sender As System.Object, _
ááá ByVal
e As System.EventArgs) Handles
Button1.Click
ááááááá Dim
a, b As Integer
ááááááá a = 100
ááááááá b = 150
ááááááá SouΦin(a, b)
ááááááá MessageBox.Show("Hodnota
prom∞nnΘ a: " & a.ToString & _
ááááááá vbCrLf & "Hodnota
prom∞nnΘ b: " & b.ToString)
ááá End
Sub
ááá Private
Sub SouΦin(ByVal
parametr1 As Integer,
_
ááá ByRef
parametr2 As Integer)
ááááááá parametr1 = parametr1 *
parametr2
ááááááá parametr2 = parametr1 *
parametr2
ááá
End Sub
End Class áá
Z uvedenΘho fragmentu zdrojovΘho k≤du je
z°ejmΘ, ₧e p°edm∞tem naÜeho zkoumßnφ bude udßlostnφ procedura Click tlaΦφtka Button1 a soukromß (Private) procedura SouΦin, kterß vypoΦφtßvß souΦin argument∙
sv²ch parametr∙. Abyste mohli peΦliv∞ sledovat tok programu, probereme si
vÜechny °ßdky po jednotliv²ch krocφch.
Dobrodru₧stvφ v udßlostnφ procedu°e Button1_Click
á
V t∞le udßlostnφ procedury jsou
deklarovßny dv∞ prom∞nnΘ (a, b)
datovΘho typu Integer. Dßle jsou ob∞ prom∞nnΘ inicializovßny
prost°ednictvφm p°i°azovacφho p°φkazu. Do prom∞nnΘ a je
ulo₧ena hodnota 100 a do prom∞nnΘ b hodnota 150. Ve
t°etφm kroku je zavolßna procedura SouΦin, kterΘ jsou
jako argumenty poskytnuty hodnoty prom∞nn²ch a a b. V tomto okam₧iku se tok programu p°emφs¥uje do procedury SouΦin.
Dobrodru₧stvφ v procedu°e SouΦin
Procedura SouΦin je soukromß, co₧ znamenß, ₧e jφ nelze pou₧φt jinde ne₧ prßv∞
v t°φd∞ formulß°e Form1 (°φkßme takΘ, ₧e
viditelnost procedury je omezena na obor t°φdy formulß°e). Velmi d∙le₧it²m
prvkem, kter² hraje roli pozd∞ji p°i vykonßvßnφ programovΘho k≤du v t∞le
procedury, je zp∙sob, jak²m jsou procedu°e SouΦin p°edßny vstupnΘ argumenty. Aby procedura v∙bec mohla b²t schopna
n∞jakΘ argumenty p°ijmout, musφ mφt za tφmto ·Φelem deklarovßny specißlnφ
prom∞nnΘ, jim₧ se °φkß parametry (nebo takΘ formßlnφ parametry). Jak si m∙₧ete
ze zßpisu signatury procedury vÜimnout, procedura mß dva parametry, pojmenovanΘ
jako parametr1 a parametr2. P°ed prvnφm parametrem se nachßzφ
klφΦovΘ slovo ByVal, kterΘ specifikuje, ₧e tomuto parametru
bude p°edßn argument hodnotou. Naproti tomu, nßzev druhΘho parametru p°edchßzφ
klφΦovΘ slovo ByRef, kterΘ oznamuje p°ekladaΦi, ₧e tento
parametr oΦekßvß argument, jen₧ bude p°edßn odkazem. á
Kdy₧ je ve volajφcφ udßlostnφ procedu°e Button1_Click volßna procedura SouΦin, jsou ji p°edßny dv∞
hodnoty. Jak se s t∞mito hodnotami vypo°ßdß procedura SouΦin? Prvnφ argument je p°edßn hodnotou, co₧ znamenß, ₧e procedu°e je
poskytnuta pouze kopie skuteΦnΘ hodnoty. Ve skuteΦnosti je tedy hodnota prom∞nnΘ
a (100) zkopφrovßna a nßsledn∞ poskytnuta procedu°e SouΦin. Procedura tak nebude pracovat se skuteΦnou hodnotou, n²br₧ prßv∞
s touto kopii. Radikßln∞ jinß je ovÜem situace p°i druhΘm argumentu, ten
je toti₧ p°edßvßn odkazem. Tedy, hodnota prom∞nnΘ b
(150) je p°φmo poskytnuta procedu°e SouΦin (p°esn∞ji je
ulo₧ena do formßlnφho parametru s nßzvem parametr2). áá
V samotnΘm t∞le procedury se nachßzejφ
dva p°i°azovacφ p°φkazy:
ááááááá parametr1 = parametr1 * parametr2
ááááááá parametr2 = parametr1 * parametr2
Co d∞lajφ? VypoΦφtßvajφ souΦin sv²ch
argument∙. V prvnφm °ßdku je vypoΦten souΦin hodnot 100 a 150, a do
prom∞nnΘ parametr1 je tedy ulo₧ena hodnota 15000. Ve
druhΘm °ßdku je vypoΦten souΦin Φφsel 15000 (co₧ je hodnota prom∞nnΘ parametr1) a 150. V²sledkem je Φφslo 2250000, kterΘ je poslΘze ulo₧eno do
prom∞nnΘ parametr2.
Otßzkou ovÜem z∙stßvß, jak se zm∞ny, provedenΘ
na argumentech v procedu°e SouΦin odrazily na podob∞
skuteΦn²ch argument∙.
Vy°eÜenφ zßhady v udßlostnφ procedu°e Button1_Click
Celou pravdu nßm zprost°edkuje a₧ metoda Show t°φdy MessageBox, kterß zobrazφ dialogovΘ okno se
souΦasn²mi hodnotami prom∞nn²ch a a b. Podφvejme se nejprve na v²sledek a pak si k n∞mu °ekneme n∞kolik
slov (obr. 1).
Obr. 1 û SkuteΦnΘ hodnoty prom∞nn²ch po exekuci
procedury SouΦin
Ano, jak se m∙₧ete z obrßzku p°esv∞dΦit,
hodnota prom∞nnΘ a je rovna 100 jednotkßm. Je to pochopitelnΘ,
proto₧e pr∙b∞h procedury SouΦin nem∞l na hodnotu
tΘto prom∞nnΘ ₧ßdn² vliv (a ani nemohl mφt, proto₧e procedura SouΦin nepracovala se skuteΦnou hodnotou prom∞nnΘ a,
ale jenom s kopii tΘto skuteΦnΘ hodnoty). Hodnota prom∞nnΘ b je p°esn∞ stejnß, jakou jsme vypoΦφtali p°i druhΘm p°i°azovacφm
p°φkazu v procedu°e SouΦin. Hodnota (argument)
150 byl procedu°e SouΦin p°edßn odkazem, byl tedy p°edßn
ukazatel na tuto hodnotu. Procedura SouΦin potΘ tuto
skuteΦnou hodnotu zm∞nila na 2250000. Prßv∞ tato hodnota je zobrazena
v dialogovΘm okn∞ se zprßvou. á
Komplexnφ mechanizmus graficky znßzor≥uje obr.
2.
Obr. 2 û Algoritmus prßce
p°edßvßnφ argument∙ r∙zn²mi zp∙soby
Konstanty
Konstanty jsou, jednoduÜe °eΦeno, prom∞nnΘ,
kterΘ nem∞nφ svou hodnotu. Dobrß, uznßvßm, ₧e p°edchozφ tvrzenφ je p°inejmenÜφm
podivnΘ, ovÜem ve skuteΦnosti pravdivΘ. Konstanty jsou specißlnφ prom∞nnΘ, do
kter²ch ovÜem m∙₧ete ulo₧it jenom jednu hodnotu. Tato hodnota musφ b²t do
konstanty ulo₧ena jeÜt∞ v re₧imu nßvrhu aplikace (teda ne a₧ za b∞hu
aplikace, jak je to obvyklΘ u prom∞nn²ch). Konstantu deklarujeme pomocφ p°φkazu
Const takto:
ááá Private Sub Button2_Click(ByVal
sender As System.Object, _
ááá ByVal e As System.EventArgs) Handles
Button2.Click
ááááááá Const
MojeKonstanta As Short
= 1200
ááá End
Sub
Za p°φkazem Const nßsleduje jmΘno pro konstantu, specifikace datovΘho typu a
inicializaΦnφ hodnota. Konstanty jsou typickΘ prßv∞ p°i°azenφm onΘ inicializaΦnφ
hodnoty, bez tΘto hodnoty by toti₧ neÜlo o konstantu. V uvedenΘm v²pisu
zdrojovΘho k≤du se nachßzφ deklarace konstanty uvnit° udßlostnφ procedury Button2_Click. Nachßzφ-li se deklarace konstanty v procedu°e Sub, ve funkci (Function) nebo v definici vlastnosti (Property), je tato konstanta pou₧itelnß jenom v oboru procedury, resp.
funkce v rßmci kterΘ je deklarovßna (obor konstanty je tak pom∞rn∞ mal²).
V praxi se obor konstant zv∞tÜuje, a to dosti radikßlnφm zp∙sobem.
Konstanty jsou v∞tÜinou deklarovßny na ·rovni t°φdy nebo modulu, aby mohly
b²t p°φstupnΘ znaΦnΘ mno₧in∞ procedur a funkcφ.
Pou₧itφ konstanty je velmi jednoduchΘ a tΘm∞°
toto₧nΘ s pou₧itφm libovolnΘ prom∞nnΘ. Zßsadnφ rozdφl tkvφ v tom, ₧e
hodnotu konstanty m∙₧ete jenom Φφst, zatφmco hodnotu prom∞nnΘ m∙₧ete takΘ
modifikovat. Mal² p°φklad za vÜechny:
ááá Private Sub Button2_Click(ByVal
sender As System.Object, _
ááá ByVal e As System.EventArgs) Handles
Button2.Click
ááááááá Const
Zrychlenφ As Single
= 9.81
ááááááá Dim m As Short, F As Integer
ááááááá m = 100
ááááááá F = m * Zrychlenφ
ááááááá MessageBox.Show("V²sledek: "
& F & " N.")
ááá End
Sub
|
Za°azenφ konstant do programovΘho k≤du mß mnohΘ v²hody. Konstanty
nejen₧e zp°ehled≥ujφ zdrojov² k≤d a zlepÜujφ jeho Φitelnost, ale takΘ vßm poskytujφ
mo₧nost rychlΘ zm∞ny hodnoty konstanty (v re₧imu nßvrhu aplikace) a tato
zm∞na se okam₧it∞ projevφ na vÜech mφstech, kde se zßpis konstanty vyskytuje.
á |
|
Krom∞ celoΦφseln²ch konstant a konstant obsahujφcφch Φφsla
s plovoucφ desetinnou Φßrkou, m∙₧ete deklarovat takΘ konstanty °et∞zcovΘ
(datov² typ String) a znakovΘ (datov² typ Char).áá |
EnumeraΦnφ typy
EnumeraΦnφ, nebo takΘ v²ΦtovΘ typy, si m∙₧ete
p°edstavit jako sadu n∞kolika konstant, kterß tvo°φ jednotn² celek. Jeden
enumeraΦnφ typ m∙₧e obsahovat mno₧stvφ Φlen∙ neboli konstant. Samotn² Φlen mß
svΘ vlastnφ jmΘno a je mu takΘ p°i°azena inicializaΦnφ hodnota. VÜechny enumeraΦnφ
typy jsou deklarovßny pomocφ p°φkazu Enum. Na rozdφl od
konstant, enumeraΦnφ typy nesmφ b²t deklarovßny uvnit° procedury, zato jejich
deklarace m∙₧e b²t uvedena na ·rovni t°φdy, modulu nebo struktury. Jak vypadß
deklarace v²ΦtovΘho typu v modulu si ukß₧eme prßv∞ te∩:
Module Module1
ááá Public
Enum M∞sφce
ááááááá Leden = 1
ááááááá ┌nor = 2
ááááááá B°ezen = 3
ááááááá Duben = 4
ááááááá Kv∞ten = 5
ááááááá ╚erven = 6
ááá End
Enum
End Module
á
Uveden² deklaraΦnφ p°φkaz na°izuje vytvo°enφ
v²ΦtovΘho typu s nßzvem M∞sφce. JednotlivΘ Φleny
enumerace se nachßzejφ v t∞le p°φkazu. Jak si m∙₧ete vÜimnout, nßÜ v²Φtov²
typ obsahuje Üest Φlen∙ pro stejn² poΦet m∞sφc∙ v roce. Ka₧d² Φlen je
inicializovßn na jistou hodnotu.
Pou₧itφ enumeraΦnφho typu je opravdu
jednoduchΘ:
ááááááá Dim a As Byte
ááááááá a = M∞sφce.Duben
ááááááá Me.Text
= a
Zde je deklarovßna prom∞nnß a datovΘho typu Byte a nßsledn∞ je do tΘto
prom∞nnΘ p°i°azena hodnota Φlenu Duben v²ΦtovΘho typu M∞sφce. Modifikovanß hodnota prom∞nnΘ a je
zobrazena v titulkovΘm pruhu hlavnφho okna aplikace.á
|
Jestli₧e zadßte za jmΘnem v²ΦtovΘho typu teΦkov² operßtor,
IntelliSense vßm nabφdne seznam platn²ch Φlen∙ danΘho enumeraΦnφho typu: |
Implicitn∞ jsou Φleny v²Φtov²ch typ∙
deklarovßny s pou₧itφm datovΘho typu Integer (tak je to i
v naÜem p°φpad∞). Jestli₧e chcete, m∙₧ete v²slovn∞ urΦit i jin²
podporovan² datov² typ (Byte, Short a Long) enumerace a vÜech jejich Φlen∙,
nap°φklad takto:
á ááááPublic Enum Barvy As Byte
ááááááá ╚ervenß = 10
ááááááá Modrß = 11
ááááááá Zelenß = 12
ááá End
Enum
Pokud explicitn∞ nezadßte inicializaΦnφ hodnoty Φlen∙
enumerace, budou jim p°irazeny v²chozφ inicializaΦnφ hodnoty, zaΦφnajφcφ od
nuly:
ááá Public
Enum Barvy As Byte
ááááááá ╚ervenß
ááááááá Modrß
ááááááá Zelenß
ááá End Enum
V tomto p°φpad∞ majφ enumeraΦnφ Φleny tyto
hodnoty:
Charakteristika
voleb Option Explicit a Option Strict
Programßto°i, kte°φ p°ichßzejφ z Visual Basicu
verze 6, jist∞ v∞dφ, co znamenß volba Option Explicit a za jak²m ·Φelem se takΘ pou₧φvß. Pro ty z vßs,
kte°φ nem∞li tu Φest pracovat s ni₧Üφ verzφ jazyka Visual Basic, jsou
urΦeny nßsledujφcφ °ßdky.
Volba Option Explicit urΦuje, zdali budete muset ve svΘm zdrojovΘm k≤du
explicitn∞ deklarovat vÜechny prom∞nnΘ Φi nikoliv. Jestli₧e je volba nastavena
na hodnotu On,
Visual Basic .NET bude zjiÜ¥ovat, jestli jste deklarovali vÜechny prom∞nnΘ
pomocφ deklaraΦnφho p°φkazu Dim. V opaΦnΘm p°φpad∞, je-li hodnota volby Off, co₧ je
implicitnφ nastavenφ, nenφ nutnΘ, abyste vÜechny prom∞nnΘ p°φmo deklarovali.
NedeklarovanΘ prom∞nnΘ majφ p°esto sv∙j datov² typ, je jφm datov² typ Object.
Zßpis volby Option Explicit (a podobn∞ takΘ volby Option Strict) se musφ ve
Visual Basicu .NET nachßzet p°ed veÜker²m zdrojov²m k≤dem danΘho souboru. Tedy
v souboru Form1.vb,
jen₧ obsahuje k≤d t°φdy formulß°e, musφ b²t zßpis volby umφst∞n na prvnφm °ßdku
(jeÜt∞ p°ed p°φkazem Imports,
nebo p°ed p°φkazem pro deklaraci t°φdy). Tento moment zachycuje obr. 3.
Obr. 3 û Nastavenφ volby Option Explicit na hodnotu On
Volba Option Strict mß s volbou Option Explicit n∞kolik
spoleΦn²ch formßlnφch rys∙. Tak p°edevÜφm, pro zßpis volby platφ stejnß
pravidla, jak tomu bylo u volby Option Explicit. Nastavovßnφ hodnoty volby je rovn∞₧ velmi podobnΘ.
Zde ovÜem vÜechny podobnosti konΦφ, proto₧e volba Option Strict mß zcela
jin² v²znam ne₧li volba Option Explicit. Je-li volba Option Strict nastavena
na hodnotu On,
jsou zakßzßny vÜechny konverze hodnot datov²ch typ∙, p°i kter²ch by mohlo dojφt
ke ztrßt∞ dat. Visual Basic .NET standardn∞ provßdφ tzv. implicitnφ konverze, a
to p°i pot°eb∞ konverze hodnot jednoho datovΘho typu do jinΘho. Tyto konverze
se realizujφ p°φmo, bez jakΘhokoliv p°iΦin∞nφ ze strany u₧ivatele. N∞kdy ovÜem
m∙₧ou tyto konverze zp∙sobit ztrßtu dat, Φemu₧ mß zabrßnit prßv∞ pou₧itφ volby Option Strict. Kdy₧ je
volba zapnuta, implicitnφ konverze hodnot datov²ch typ∙ jsou povoleny jen
v tom p°φpad∞, jestli₧e jde o typov∞ bezpeΦnou operaci. Pokud budete chtφt
provΘst konverzi, kterou volba Option Strict nepovoluje, musφte pou₧φt tzv. explicitnφ konverznφ
mechanizmus, v rßmci kterΘho urΦφte zp∙sob konverze hodnot. O konverznφch
mechanizmech si povφme p°φÜt∞.
Jßn Hanßk