|
ZaΦßteΦnφk |
PokroΦil² |
Profesionßl |
|||||
|
|
|
||||||
┌vod
do sv∞ta .NET /5. dφl Modernφ technologie
v²voje softwaru |
||||||||
|
|
Budete pot°ebovat
p°ibli₧n∞ 1 hodinu |
|
OperaΦnφ systΘm
pou₧it² v p°φsp∞vku: Windows 2000 V²vojovΘ nßstroje: Visual Basic .NET |
||||
|
Milφ Φtenß°i,
dnes prozkoumßme problematiku datov²ch typ∙, s nimi₧ se m∙₧ete st°etnout p°i programovßnφ ve VB .NET.
Raison d┤être datov²ch typ∙ ve VB .NET
Jak jsme si pov∞d∞li ji₧ v minulΘ Φßsti serißlu, p°i deklaraci prom∞nnΘ je pot°ebnΘ urΦit datov² typ tΘto prom∞nnΘ. V tΘto souvislosti jste se mohli zeptat, proΦ se v∙bec t°eba zab²vat s n∞jak²mi datov²mi typy, proΦ nenφ jednoduÜe mo₧nΘ pou₧φvat v₧dy a na vÜechny programovΘ operace jenom prom∞nnΘ jednoho datovΘho typu? V₧dy¥ by to bylo zcela jist∞ snazÜφ, nebo ne? Inu, lehΦφ by to jist∞ bylo, ale podobnΘ myÜlenky musφ pustit ka₧d² z hlavy, kdy₧ se zamyslφ nad v²znamem slov optimßlnφ rychlost a v²konnost. Kdybyste pracovali jenom s prom∞nn²mi jednoho datovΘho typu, zcela jist∞ byste se zßhy zaΦali potkßvat s mnoha problΘmy. P°edevÜφm, v²konnost aplikace by byla pom∞rn∞ nφzkß a p°i kritick²ch operacφch by mohlo dojφt bu∩ k ne·nosnΘmu zpomalenφ, nebo p°φmo ke krachu aplikace. Dßle byste mohli zjistit, ₧e i kdy₧ neprovßdφte zrovna rozsßhlΘ propoΦty, spot°ebovßvßte stßle v∞tÜφ a v∞tÜφ mno₧stvφ pam∞¥ovΘho prostoru poΦφtaΦe. A koneΦn∞, o optimßlnφ v²konnosti a rychlosti programu by nemohlo b²t ani °eΦi.
Z uveden²ch d∙vod∙ je pot°ebnΘ, aby programovacφ jazyk dokßzal efektivn∞ pracovat s rozliΦn²mi datov²mi typy. Jak za chvφli uvidφte, datov²ch typ∙ je ve VB .NET znaΦnΘ mno₧stvφ. Krom∞ toho, ₧e mßte k dispozici r∙znΘ datovΘ typy, je rovn∞₧ velmi d∙le₧itΘ, abyste se nauΦili, kdy ten-kter² datov² typ pou₧φt. Prßv∞ schopnost programßtora ävycφtitô, kdy pou₧φt ten, nebo jin² datov² typ, pat°φ mezi jeho nejv∞tÜφ p°ednosti. To ji₧ vÜak pon∞kud zachßzφme do problematiky optimalizace programovΘho k≤du, a proto si rad∞ji uka₧me, s jak²mi datov²mi typy se budete moci setkat ve VB .NET.
P°ehled datov²ch typ∙ ve VB .NET
Celou mno₧inu datov²ch typ∙ ve VB .NET lze rozd∞lit na nßsledujφcφ podmno₧iny:
CeloΦφselnΘ datovΘ typy
Myslφm, ₧e se zßstupci tΘto kategorie se budete st°etßvat asi nejΦast∞ji. Jak je z nßzvu z°ejmΘ, tato podmno₧ina datov²ch typ∙ je urΦena na uchovßvßnφ celoΦφseln²ch hodnot. P°ehled konkrΘtnφch datov²ch typ∙ m∙₧ete vid∞t v tab. 1.
Tab. 1
Datov² typ ve VB .NET |
Charakteristika |
Rozsah |
.NET ekvivalent |
Byte |
8-bitovΘ celΘ Φφslo
bez znamΘnka |
<0, 255> |
System.Byte |
Short |
16-bitovΘ celΘ Φφslo
se znamΘnkem |
<-32768, 32767> |
System.Int16 |
Integer |
32-bitovΘ celΘ Φφslo
se znamΘnkem |
<-231, 231-1> |
System.Int32 |
Long |
64-bitovΘ celΘ Φφslo
se znamΘnkem |
<-263, 263-1> |
System.Int64 |
áá á
|
Rozsah datovΘho typu si m∙₧ete p°edstavit jako definiΦnφ obor datovΘho
typu (p°esn∞ji °eΦeno, jde o definiΦnφ obor prom∞nnΘ danΘho datovΘho typu). á |
Pokud vßm nenφ jasnΘ, co znamenajφ textovΘ charakteristiky äΦφslo bez znamΘnkaô a äΦφslo se znamΘnkemô uvedenΘ v tabulce, nem∞jte obavy, zde je vysv∞tlenφ. Nejprve si p°edstavte jednoduchou Φφselnou os. Pokud rozsah po₧adovanΘho datovΘho typu le₧φ pouze v kladnΘ Φßsti tΘto pomyslnΘ ΦφselnΘ osi, tak °φkßme, ₧e dan² datov² typ m∙₧e uchovßvat celß Φφsla bez znamΘnka (tedy jenom kladnß Φφsla). Na druhΘ stran∞, kdy₧ rozsah datovΘho typu le₧φ na obou stranßch osi, pak °φkßme, ₧e jde o datov² typ, jen₧ je schopen uklßdat celß Φφsla takΘ se znamΘnkem (tedy kladnß i zßpornß Φφsla). Pro lepÜφ ilustraci se podφvejte na obr. 1.
Obr. 1 û NßzornΘ zobrazenφ rozsahu vybran²ch datov²ch
typ∙ pomocφ pomyslnΘ ΦφselnΘ osi
Pokud budete chtφt deklarovat prom∞nnou jednoho z uveden²ch celoΦφseln²ch datov²ch typ∙, budete postupovat tak, jak jsme si ukßzali ji₧ minule. Pou₧ijete tedy p°φkaz Dim s jmΘnem prom∞nnΘ, za kter²m bude nßsledovat klφΦovΘ slovo As a specifikace datovΘho typu. P°φklad:
ááááááá Dim
prom∞nnß_ABC As Short
ááááááá prom∞nnß_ABC = 120
DatovΘ typy pro uchovßvßnφ Φφsel s pohyblivou desetinnou Φßrkou
Ve VB .NET m∙₧ete nalΘzt t°i datovΘ typy, kterΘ vßm umo₧nφ pracovat s Φφsly s desetinnou Φßrkou. Jejich popis najdete v tab. 2.
Tab. 2
Datov² typ ve VB .NET |
Charakteristika |
P°esnost |
.NET ekvivalent |
Single |
32-bitovΘ Φφslo
s pohyblivou desetinnou Φßrkou |
7 desetinn²ch mφst |
System.Single |
Double |
64-bitovΘ Φφslo
s pohyblivou desetinnou Φßrkou |
15-16 desetinn²ch
mφst |
System.Double |
Decimal |
128-bitovΘ Φφslo
s pohyblivou desetinnou Φßrkou |
28 desetinn²ch mφst |
System.Decimal |
Specifikace rozsahu jednotliv²ch datov²ch typ∙ se nachßzφ v tab. 3.
Tab. 3
Datov² typ ve VB .NET |
Rozsah |
Single |
<+/- 1,4 x 10-45, +/- 3,4 x 1038> |
Double |
<+/- 5,0 x 10-324,
+/- 1,7 x 10308> |
Decimal |
<+/- 1,0 x 10-28,
+/- 7,9 x 1028> |
Datov² typ Single se vyznaΦuje nejmenÜφ p°esnostφ, a proto jej m∙₧ete efektivn∞ pou₧φvat ve chvφlφch, kdy₧ sice budete pot°ebovat uchovat Φφslo s desetinnou Φßrkou, no nebudete vy₧adovat p°φliÜnou p°esnost p°i provßd∞nφ po₧adovanΘ operace. AΦkoli je datov² typ Decimal nejp°esn∞jÜφ (m∙₧e uchovat a₧ 28 Φφslic za desetinnou Φßrkou), spot°ebuje takΘ nejv∞tÜφ mno₧stvφ pam∞¥ovΘho prostoru (16 bajt∙). Pokud nebudete v²slovn∞ po₧adovat vysokou p°esnost, nebo provßd∞t slo₧itΘ finanΦnφ kalkulace, nenφ mnoho d∙vod∙ pro vyu₧itφ slu₧eb tohoto datovΘho typu. Jakousi zlatou st°ednφ cestu p°edstavuje datov² typ Double, reprezentovan² v podob∞ Φty°iaÜedesßtibitovΘho Φφsla s pohyblivou desetinnou Φßrkou. Jestli₧e budete chtφt up°ednostnit rovnovßhu mezi nabφzenou p°esnostφ a spot°ebou pam∞ti, je velmi pravd∞podobnΘ, ₧e prßv∞ datov² typ Double se stane vaÜφm favoritem.
P°φklad pou₧itφ:
ááááááá Dim
koeficient As Double
ááááááá koeficient = 1000.255
Ostatnφ datovΘ typy
Krom∞ datov²ch typ∙ pro prßci s cel²mi Φφsly a Φφsly s desetinnou Φßrkou si musφme pov∞d∞t takΘ o dalÜφch datov²ch typech, kterΘ se velmi Φasto oznaΦujφ i jako äneΦφselnΘô datovΘ typy. Jde o tyto datovΘ typy:
Datov² typ Boolean se pou₧φvß pro reprezentaci dvou pravdivostnφch stav∙ prom∞nnΘ: True a False. S prom∞nn²mi tohoto typu se m∙₧ete setkat nap°φklad p°i rozhodovacφch konstrukcφch a cyklech (programov² k≤d rozhodovacφ konstrukce se provede, jestli₧e je pravdivostnφ hodnota prom∞nnΘ True, cyklus se m∙₧e opakovat tak dlouho, dokud prom∞nnß obsahuje hodnotu True atd.). Prom∞nnΘ datovΘho typu Boolean jsou uchovßvßny jako 16-bitovß Φφsla.
|
Kdy₧ jsou ΦφselnΘ datovΘ typy konvertovßny do datovΘho typu Boolean,
postupuje se podle nßsledujφcφho pravidla: vÜechny ΦφselnΘ hodnoty krom∞ nuly
(0) p°edstavujφ pravdivostnφ hodnotu True a samotnß nula odpovφdß hodnot∞
False. áá |
á
P°φklad aplikace:
ááááááá Dim
podmφnka As Boolean
á podmφnka = True
áá
Datov² typ Char vßm pom∙₧e, budete-li chtφt pracovat se symboly Unicode v rozsahu
<0, 65535>. Pokud budete chtφt deklarovat prom∞nnou Znak datovΘho typu Char a p°i°adit do nφ znak
äWô, m∙₧ete to ud∞lat takto:
áá áááááDim znak As Char
ááááááá znak = "W"c
VÜimn∞te si prosφm, ₧e znak je umφst∞n do dvojit²ch uvozovek a je k n∞mu p°idßn takΘ sufix äcô. Kdy₧ pou₧ijete tento sufix, tak Visual Basicu .NET sd∞lujete, aby na uveden² symbol nahlφ₧el jako na znak datovΘho typu Char.
|
Pou₧itφ sufixu je nevyhnutnΘ jenom p°i programovßnφ s volbou Option
Strict nastavenou na hodnotu On. O pou₧itφ tΘto volby si povφme p°φÜt∞. áá |
I kdy₧ je prßce s textov²mi °et∞zci v jin²ch jazycφch (zejmΘna C a C++) dosti nßroΦnß, VB .NET vßs ani tentokrßt nenechß na holiΦkßch. Nabφzφ vßm datov² typ String, jen₧ vßm poslou₧φ p°i uklßdßnφ textov²ch °et∞zc∙ jakΘhokoliv druhu. Jenom pamatujte na to, ₧e textov² °et∞zec musφ b²t umφst∞n do dvojit²ch uvozovek tak, jak je to uvedeno nφ₧e:
á
ááááááá Dim
pozdrav As String
áááá pozdrav = "OptimalizovanΘmu k≤du zdar!"
Prom∞nnΘ datovΘho typu String si m∙₧ete p°edstavit jako sekvenci 16-bitov²ch Φφsel bez znamΘnka v rozsahu <0, 65535>. Pokud rozvineme myÜlenky, ka₧dΘ Φφslo si m∙₧ete dßle p°edstavit jako symbol Unicode. Prost°ednictvφm analogie pak dojdeme k tomu, ₧e datov² typ String je posloupnostφ vφce instancφ datovΘho typu Char.á áá
Chcete-li nap°φklad zjistit, kolik dnφ uplynulo ode dne vaÜeho narozenφ, zcela jist∞ budete pot°ebovat datov² typ Date. Prom∞nnΘ datovΘho typu Date jsou schopny pojmout popis data, a to od 1. ledna roku 1 a₧ do 31. prosince roku 9999. Tento datov² typ je rovn∞₧ mo₧nΘ pou₧φt pro uklßdanφ Φasu, od p∙lnoci (0:00:00) a₧ do konce dne (23:59:59).
ááááááá Dim
datum_narozeni As Date
ááááááá Dim
dnesni_datum As Date
ááááááá Dim
rozdil As
Long
ááááááá datum_narozeni
= #3/21/2002#
ááááááá dnesni_datum
= #3/21/2003#
ááááááá rozdil
= DateDiff(DateInterval.Day, _
ááááááá datum_narozeni,
dnesni_datum)
áááá MessageBox.Show(rozdil.ToString)
Na uvedenΘ ukßzce programovΘho k≤du jsme si ukßzali zßkladnφ nßle₧itosti, kterΘ platφ p°i prßci s datov²m typem Date. P°edn∞ je pot°ebnΘ, abyste m∞li na pam∞ti, ₧e datum, kterΘ budete uklßdat do p°φsluÜnΘ prom∞nnΘ, musφ b²t zapsßno v tomto formßtu:
#m∞sφc/den/rok#
Aby bylo mo₧nΘ zjistit, kolik dnφ tvo°φ interval stanoven² dv∞ma daty, m∙₧eme zavolat funkci DateDiff. Funkci zadßme poΦßteΦnφ i koneΦnφ datum a jeÜt∞ specifikujeme, aby v²sledkem byl poΦet dnφ mezi zadan²mi daty.á
Datov² typ Object je schopen pojmout hodnotu jakΘhokoliv datovΘho typu. Prom∞nnΘ tohoto typu m∙₧ou obsahovat jak celß Φφsla, tak numerickΘ hodnoty s pohyblivou desetinnou Φßrkou a rovn∞₧ tak hodnoty ostatnφch datov²ch typ∙. Datov² typ Object mß rozsah 32 bit∙.
|
VÜechny datovΘ typy, Φi u₧ jde o hodnotovΘ nebo referenΦnφ typy, jsou
odvozeny z bßzovΘho typu Object. Jinak °eΦeno, datov² typ Object
je zßkladem pro vÜechny ostatnφ datovΘ typy. |
áááááááá P°φklad pou₧itφ:
ááááááá Dim
obj As
Excel.Application
ááááááá obj
= CType(CreateObject("Excel.Application"),
_
ááááááá Excel.Application)
á obj.Visible = True
U₧ivatelsky definovanΘ datovΘ typy
Budete-li chtφt, m∙₧ete definovat takΘ svΘ vlastnφ datovΘ typy. U₧ivatelsky definovanΘ typy (UDT) se tvo°φ pomocφ p°φkazu Structure, jen₧ mß tento tvar:
Structure JmΘno_u₧ivatelsky_definovanΘho_datovΘho_typu
æ deklarace Φlen∙ struktury
End Structure
Struktura obvykle obsahuje n∞kolik Φlen∙. ╚lenem se rozumφ deklarovanß prom∞nnß podporovanΘho datovΘho typu. P°edpoklßdejme, ₧e budete chtφt vytvo°it u₧ivatelsky definovan² datov² typ s nßzvem Student. U₧ vφte, ₧e k tomu, abyste splnili tento ·kol, budete pot°ebovat vytvo°it strukturu. Dßle p°edpoklßdejme, ₧e budete chtφt sledovat jmΘno studenta a jeho pr∙m∞rn² prosp∞ch. Proto vytvo°φte dva Φleny struktury, jeden s nßzvem JmΘno_studenta (datov² typ String) a dalÜφ s nßzvem Pr∙m∞rn²_prosp∞ch (datov² typ Single). á
|
Programov² k≤d pro zßpis charakteristiky u₧ivatelsky definovanΘho
datovΘho typu musφte umφstit p°ed vÜechen k≤d t°φdy formulß°e, nebo do
samostatnΘho modulu. V nßsledujφcφm textu bude oz°ejm∞na druhß varianta.
áááá |
Po vytvo°enφ struktury bude mo₧nΘ deklarovat prom∞nnou datovΘho typu Student. Tuto prom∞nnou poslΘze inicializujeme na po₧adovanΘ hodnoty. Jak na to, si ukß₧eme v nßsledujφcφ praktickΘ programovΘ ukßzce. Postupujte podle vyznaΦen²ch instrukcφ:
Obr. 2 û V²b∞r modulu v okn∞ Add New Item
Module Module1
ááá Structure Student
ááááááá Dim JmΘno_studenta As String
ááááááá Dim Pr∙m∞rn²_prosp∞ch As Single
ááá End Structure
End Module
ááááááá Dim
student1 As Student
ááááááá student1.JmΘno_studenta =
"Jan Novßk"
ááááááá student1.Pr∙m∞rn²_prosp∞ch =
3.2
ááááááá MessageBox.Show("JmΘno studenta: " &
student1.JmΘno_studenta & _
ááááááá Chr(13) & "Pr∙mern² prosp∞ch: " &
student1.Pr∙m∞rn²_prosp∞ch, _
á "èkolnφ zßznam")
V tΘto chvφli bych se rßd p°istavil p°i tomto fragmentu programovΘho k≤du a vysv∞tlil vßm, jak pracuje. Prvnφ d∙le₧itou v∞cφ je samotnß deklarace prom∞nnΘ. Jak vidφte, prom∞nnß student1 je deklarovßna pou₧itφm u₧ivatelsky definovanΘho typu Student. Pon∞kud nejasn²m se vßm m∙₧e zdßt takΘ zp∙sob, jak²m je prom∞nnß student1 inicializovßna. P°i inicializaci UDT toti₧ platφ podobnß pravidla jako p°i inicializaci vlastnostφ. Proto musφ za nßzvem prom∞nnΘ nßsledovat teΦkov² operßtor (.) a jmΘno platnΘho Φlena struktury, pomocφ kterΘ byla naÜe prom∞nnß (student1) vytvo°ena. ╚lenu struktury je nakonec p°i°azena hodnota na zßklad∞ specifikace jeho datovΘho typu. Podobnou koncepci, jakß platila p°i inicializaci prom∞nnΘ, pou₧ijete i ve chvφli, kdy budete chtφt zp∞tn∞ zφskat hodnoty, kterΘ Φleny struktury obsahujφ.
|
Jestli₧e chcete rozd∞lit programov² k≤d na n∞kolik °ßdk∙, na konci
jednoho °ßdku zadejte mezeru a znak podtr₧enφ (_). Dßle stiskn∞te
klßvesu Enter a ápokraΦujte
v psanφ k≤du na nßsledujφcφm °ßdku. |
|
Pro spojenφ r∞t∞zce a prom∞nnΘ v signatu°e metody Show
t°φdy MessageBox m∙₧ete pou₧φt symbol z°et∞zenφ (&). Simulaci aktivace klßvesy Enter docφlφte, kdy₧
funkci Chr p°edßte ASCII k≤d tΘto klßvesy (jen₧ mß hodnotu 13). á |
V∞°φm, ₧e na prvnφ pohled m∙₧e b²t tento postup pou₧itφ UDT pon∞kud frustrujφcφ, no nem∞jte obavy, zanedlouho bude pro vßs vytvß°enφ a pou₧φvßnφ u₧ivatelsky definovan²ch typ∙ hraΦkou.
Obr. 3 û V²sledek prßce UDT
Jßn Hanßk