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.

 

Obsah

Raison dêtre datov²ch typ∙ ve VB .NET

P°ehled datov²ch typ∙ ve VB .NET

CeloΦφselnΘ datovΘ typy

DatovΘ typy pro uchovßvßnφ Φφsel s pohyblivou desetinnou Φßrkou

Ostatnφ datovΘ typy

U₧ivatelsky definovanΘ datovΘ typy

 

 

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:

 

  1. CeloΦφselnΘ datovΘ typy
  2. DatovΘ typy pro uchovßvßnφ Φφsel s pohyblivou desetinnou Φßrkou
  3. Ostatnφ datovΘ typy

 

 

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:

 

  1. Boolean (.NET ekvivalent: System.Boolean)

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

áá

  1. Char (.NET ekvivalent: System.Char)

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∞. áá

 

  1. String (.NET ekvivalent: System.String)

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.á áá

 

  1. Date (.NET ekvivalent: System.DataTime)

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.á

 

  1. Object

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φ:

 

  1. Spus¥te VB .NET a vytvo°te nov² projekt.
  2. Vyberte nabφdku Project a klepn∞te na polo₧ku Add New Item.
  3. V sekci Templates okna Add New Item vyberte ikonu modulu (obr. 2).

 

 

Obr. 2 û V²b∞r modulu v okn∞ Add New Item

 

  1. Aktivujte tlaΦφtko Open, na co₧ se do projektu p°idß soubor s modulem (je standardn∞ pojmenovßn jako Module1.vb).
  2. Vlo₧te do k≤du modulu programov² k≤d pro vytvo°enφ struktury Student:

 

Module Module1

ááá Structure Student

ááááááá Dim JmΘno_studenta As String

ááááááá Dim Pr∙m∞rn²_prosp∞ch As Single

ááá End Structure

End Module

 

  1. Na formulß° umφst∞te tlaΦφtko (nechte jej standardn∞ pojmenovanΘ) a jeho obsluhu udßlosti Click vypl≥te nßsledujφcφm k≤dem:

 

ááááááá 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.

 

  1. V²sledek prßce k≤du celΘ praktickΘ ukßzky m∙₧ete vid∞t na obr. 3.

 

 

Obr. 3 û V²sledek prßce UDT

 

 

Jßn Hanßk