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∙

Dobrodru₧stvφ v udßlostnφ procedu°e Button1_Click

Dobrodru₧stvφ v procedu°e SouΦin

Vy°eÜenφ zßhady v udßlostnφ procedu°e Button1_Click

Konstanty

EnumeraΦnφ typy

Charakteristika voleb Option Explicit a Option Strict

 

 

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