Integrované prostředí rubriky Visual Basic |
|||||||
|
Začínáme s VB
.NET |
||||||
Úvod do světa .NET (9. díl) |
|||||||
Časová náročnost (min): 45 |
Začátečník |
Pokročilý |
Profesionál |
||||
|
|
|
|||||
|
Použitý operační systém : Hlavní vývojový
nástroj : Další vývojový software : Jiný software : |
Windows 2000 SP3 Visual Basic .NET
2002 Žádný Žádný |
|||||
|
Milí čtenáři,
v deváté lekci našeho seriálu si povíme něco o konverzních mechanizmech, které řídí konverzi hodnot proměnných různých datových typů při rozmanitých příležitostech, například při použití přiřazovacího příkazu, nebo při práci s parametry procedury. Dozvíte se, jak pracují implicitní a explicitní konverze a jaké funkce použít při konverzi hodnot proměnných různých datových typů.
Obsah |
Filosofie konverzních mechanizmů
Máme-li mluvit o konverzních mechanizmech, musíme si ze všeho nejdříve vysvětlit jejich smysl, neboli skutečnost, proč je vůbec potřebné nějaké konverze používat. Každý programovací jazyk obsahuje jistou množinu vestavěných datových typů, které můžou uchovávat různorodé hodnoty. Nejinak je tomu i ve Visual Basicu .NET. V předešlých dílech seriálu jste mohli vidět přehled zástupců mnoha datových typů, se kterými jsme pracovali v programovém kódu. Již víte, že takzvané celočíselné datové typy mají možnost pracovat s celými čísly, a že třeba proměnné datového typu String dokáží uložit velmi dlouhý textový řetězec. Ano, dosud nebylo zapotřebí jakkoliv se zmiňovat o konverzích mezi proměnnými jednotlivých datových typů, protože tyto proměnné působily více-méně osamoceně. Pokud ovšem budeme chtít, aby proměnné začaly mezi sebou mluvit, záhy se potřeba konverze hodnot dostaví sama.
Pod pojmem konverze se ve všeobecnosti rozumí jistá proměna zdrojových dat na cílová data. Pracuje-li s grafickým softwarem, je možné, že často převádíte rastrové obrázky z jednoho formátu do jiného. Povězme, že máte za úkol převést obrázek, jenž je uložen ve formátu BMP, do podoby souboru JPG. Přesně toto je názorný příklad konverze. Jak tato konverze probíhá? Vskutku jednoduše, protože vše za vás vyřeší váš program pro editaci grafických předloh. Program jednoduše vezme vstupní data (rastrový obrázek ve formátu BMP) a tato data konvertuje do požadované cílové podoby (formát JPG). Tuto situaci přibližuje obr. 1.
Obr. 1 – Názorná ukázka konverze
jednoho grafického formátu do jiného
Situace, podobné té předchozí, se vyskytují i v programování. Zde ovšem nepůjde přímo o změnu formátu grafického obrázku, nýbrž o změnu hodnot proměnných různých datových typů. Budeme-li postupovat analogicky, můžeme tuto situaci opět graficky znázornit (obr. 2).
Obr. 2 – Jedna z podob konverzního procesu v programování
V uvedeném schématu je ilustrována konverze hodnoty proměnné celočíselného datového typu do proměnné datového typu String (mimochodem, jde o jeden z nejběžnějších typů konverzí).
Zajímavější je ovšem pohled na tento příklad po jednotlivých částech. Povězme, že máme deklarovanou proměnnou A datového typu Integer, ve které je uložena jistá numerická hodnota (řekněme 100). Hodnota 100 představuje naše zdrojová data, která vstupují do konverzního mechanizmu. Jak jsme si již řekli, výsledkem práce konverzního mechanizmu jsou jistá cílová data. V našem případě mají tato data podobu textového řetězce, jenž obsahuje znaky „1“, „0“ a „0“. Textový řetězec je uschován v proměnné B datového typu String. Z číselné hodnoty 100 se tedy stane řetězec „100“, který můžeme zobrazit třeba v titulkovém pruhu hlavního okna aplikace. Nyní se podívejme, jak tento modelový příklad znázornit v programovém kódu Visual Basicu .NET:
Dim A As Integer = 100
Dim
B As String
B = A
Me.Text = B
Nejpozoruhodnější je bezpochyby třetí řádek s přiřazovacím příkazem B = A. Algoritmus přiřazovacího příkazu má přibližně tuto podobu:
Všimněte si, že konverze byla v uvedeném příkladu provedena zcela automaticky a bez jakéhokoliv zásahu ze strany programátora (všechnu práci vykonal Visual Basic sám). Konverzím, které se uskutečňují automaticky se říká implicitní konverze. Opakem implicitních konverzí jsou konverze explicitní, při kterých musí programátor určit předmět a typ kýžené konverze. V dalších částích se podíváme na implicitní a explicitní konverze zblízka.
Implicitní konverze
Implicitní konverze jsou realizovány automaticky vždy, když konverze může být provedena bez toho, aby došlo ke ztrátě dat. Visual Basic je zvyčejně natolik chytrý, že ví, kdy implicitní konverze provést k plné spokojenosti programátora. Některé varianty, které přináší implicitní konverzní mechanizmus, jsou shrnuty v tab. 1.
Tab. 1 – Implicitní konverze
Zdrojový datový typ |
Cílový datový typ |
Byte |
Short, Integer,
Long, Single, Double, Decimal |
Short |
Integer, Long,
Single, Double, Decimal |
Integer |
Long, Single,
Double, Decimal |
Long |
Single, Double,
Decimal |
Single |
Double |
Char |
Integer, Long, Single,
Double, Decimal |
Ukažme si další příklad, v němž se uplatňuje mechanizmus implicitní konverze:
Dim intPočet As Integer, lngPočet As Long
intPočet = 100000
lngPočet = intPočet
MessageBox.Show("Hodnota proměnné lngPočet je " & lngPočet)
Zde jsou deklarované dvě proměnné: Proměnná intPočet typu Integer a proměnná lngPočet typu Long. Do proměnné intPočet je přiřazena hodnota 100000. Následně je hodnota integerovské proměnné přiřazena do proměnné lngPočet. Jelikož obě proměnné jsou deklarované použitím různých datových typů, dochází v tomto případě k exekuci konverzního mechanizmu. Při bližším pohledu by bylo možné říci, že jde o rozšiřující konverzi (widening conversion), protože proměnné datového typu Long zabírají více místa v paměti a rovněž tak mají daleko větší rozsah ve srovnání s proměnnými datového typu Integer. Zatímco proměnná intPočet obsazuje v paměti 32 bitů, u proměnné lngPočet je to až 64 bitů (obr. 3).
Obr. 3 –
Anatomie proměnných intPočet a lngPočet
Z uvedeného jasně vyplývá, že při konverzi hodnot proměnných datového typu Integer do proměnných datového typu Long nemůže nikdy dojít k žádné ztrátě dat, a proto je tato konverze zcela bezpečná.
V posledním kroku je zobrazena hodnota proměnné lngPočet v dialogovém okně se zprávou. Ačkoliv to možná není na první pohled patrné, i v tomto příkaze dochází ke konverzi hodnoty. Za všechno může operátor zřetězení (&), jenž převede hodnotu proměnné lngPočet na hodnotu datového typu String. Takto vzniklý textový řetězec je dále spojen s textovým řetězcem, jenž se nachází nalevo od operátoru &. Spojením, neboli zřetězením těchto dvou textových řetězců vzniká nový řetězec, který je následně zobrazen v okně se zprávou.
Kromě rozšiřujících konverzí existují i opozitní konverze, při kterých dochází ke konverzi hodnot do datového typu s menším rozsahem (narrowing conversions). Posuďte tento fragment zdrojového kódu:
Dim x As Byte, y As Short
y = 200
x = y
MessageBox.Show("Hodnota proměnné x je " & x)
Máme zde deklarovanou proměnnou x datového typu Byte a proměnnou y datového typu Short. Do proměnné y je přiřazena hodnota 200. Dále je hodnota proměnné y přiřazena do proměnné x. Samotnému přiřazení předchází konverze hodnoty proměnné y do hodnoty datového typu Byte (jde o datový typ cílové proměnné, která se nachází na levé straně přiřazovacího příkazu). Všimněte si prosím, že i když je rozsah proměnné y větší než rozsah proměnné x, proběhne toto přiřazení bez problémů. Důvodem je skutečnost, že proměnná y obsahuje hodnotu (200), která se nachází rovněž v intervalu přípustných hodnot pro datový typ Byte cílové proměnné x. Co se ale stane, když do proměnné y přiřadíme třeba hodnotu 1000?
Dim x As Byte, y As Short
y = 1000
x = y
MessageBox.Show("Hodnota proměnné x je " & x)
V tomto případě bude vygenerována chyba
za běhu programu (obr. 4).
Obr. 4 – Chyba přetečení
Jak se můžeme dozvědět z chybového hlášení, došlo k výjimce System.OverflowException. Visual Basic nám sděluje, že při realizaci přiřazovacího příkazu došlo k překročení hranic datového typu Byte proměnné x (jde o takzvanou chybu přetečení rozsahu datového typu) Protože proměnná datového typu Byte může pojmout pouze 256 hodnot z intervalu <0, 255>, není jednoduše možné do této proměnné uložit hodnotu 1000. Chybu můžeme vyřešit v zásadě dvěma způsoby:
Dim x As Byte, y As Short
y =
1000
If y >= 0 And y
<= 255 Then
x
= y
MessageBox.Show("Hodnota proměnné x je " & x)
Else
MessageBox.Show("Hodnota " & y & _
" nemůže být uložena do proměnné x.")
End If
I když jsme se ještě v našem seriálu nevěnovali řízení toku programu pomocí rozhodovací programovací konstrukce If, nastává vhodná chvíle na alespoň malou ukázku. Rozhodovací konstrukce If testuje jistou podmínku a v případě, že je tato podmínka splněna (jinak řečeno, výraz v podmínce je vyhodnocen na pravdivostní hodnotu True), je proveden kód, jenž se nachází za klíčovým slovem Then. Není-li podmínka splněna, je proveden programový kód, jenž následuje za návěstím Else. Celá konstrukce If je uzavřena příkazem End If. Velmi důležitý je výraz, který se testuje. V našem případě vypadá testovací výraz následovně:
y >= 0 And y <= 255
Tento výraz není jednoduchý, nýbrž kombinovaný. Provádí testování proměnné y pomocí logického operátoru AND. Výraz je pravdivý, jestliže je proměnná y rovna nebo větší než nula a současně menší nebo rovna hodnotě 255. Je-li výraz vyhodnocen na pravdivostní hodnotu True, je podmínka splněna a proveden programový kód, jenž následuje na klíčovým slovem Then. Řečeno jinak, obsahuje-li proměnná y přípustnou hodnotu, kterou lze přiřadit do proměnné x, přiřazovací příkaz bude vykonán. Jinak bude zobrazeno dialogové okno se zprávou, že přiřazení nelze uskutečnit.
Prezentovaná technika zamezí vzniku chyby za běhu programu a nebude zobrazeno ani žádné chybové hlášení. Někteří programátoři tuto techniku znají pod názvem defenzivní programování, jehož cílem je předvídání výskytu chyby a v případě vzniku chyby její okamžité ošetření.
Explicitní konverze
Explicitní konverze jsou nevyhnutné tehdy, když hodnoty proměnných různých datových typů nemůžou být implicitně konvertovány. Ve skutečnosti nabírá potřeba explicitních konverzí na významu v případě, že při programování používáte volbu Option Strict nastavenou na hodnotu On. Volba Option Strict:
|
Vytváření objektů s pozdní vazbou (late-binding) probereme
někdy příště, kdy se budeme učit o objektově orientovaném programování (OOP).
|
Pokud budete chtít konvertovat hodnoty proměnných rozličných datových typů, budete muset použít funkci CType, případně jiné konverzní funkce, které jsou uvedeny v tab. 2.
Název konverzní funkce |
Návratová hodnota konverzní funkce |
CBool |
Boolean |
CByte |
Byte |
CChar |
Char |
CDate |
Date |
CDbl |
Double |
CDec |
Decimal |
CInt |
Integer |
CLng |
Long |
CObj |
Object |
CShort |
Short |
CSng |
Single |
CStr |
String |
Ukažme si názorný příklad (přitom předpokládáme, že je aktivována volba Option Strict):
Dim intVýsledek As Integer, strŘetězec As
String
intVýsledek = Math.Max(5000,
10000)
strŘetězec = CType(intVýsledek, String)
Me.Text
= strŘetězec
Ve výpisu zdrojového kódu jsou deklarované dvě proměnné, intVýsledek datového typu Integer a strŘetězec datového typu String. Do proměnné intVýsledek je uložena hodnota, kterou vrací metoda Max třídy Math. Tato metoda přijímá dvě celočíselné hodnoty a vrací tu z nich, která je větší. Metoda vrací hodnotu v podobě celého čísla datového typu Integer. Náš hlavní úkol spočívá v uložení získané návratové hodnoty do proměnné strŘetězec, která je zástupcem datového typu String. Jak jsme si již pověděli, aktivovaná volba Option Strict nedovoluje Visual Basicu provést implicitní konverzi celočíselné hodnoty do podoby textového řetězce. Proto musíme použít funkci CType v uvedeném tvaru.
Funkce CType pracuje se dvěmi parametry. Prvním z nich je název vstupní proměnné (intVýsledek), která vstupuje do konverzního procesu. Druhým parametrem je název datového typu (String), do něhož má být vstupní proměnná konvertována. Výsledkem práce funkce je textový řetězec, jenž je zobrazen v titulkovém pruhu okna formuláře.
Analogicky by bylo možné předcházející programovou ukázku přepsat použitím konverzní funkce CStr:
Dim intVýsledek As Integer, strŘetězec As
String
intVýsledek = Math.Max(5000,
10000)
strŘetězec = CStr(intVýsledek)
Me.Text
= strŘetězec
Další příklad vypíše do titulkového pruhu aplikace textový řetězec „True“:
Dim a As Short, b As Boolean
a = 100
b = CBool(a)
Me.Text = CStr(b)
Konverze typu celočíselná hodnota à pravdivostní hodnota datového typu Boolean jsou možné a platí, že jakákoliv nenulová hodnota reprezentuje hodnotu True, zatímco nula je konvertována na pravdivostní hodnotu False. Pokud byste chtěli přiřadit hodnotu proměnné typu Boolean do celočíselné proměnné typu Integer, pravdivostní hodnotu True bude reprezentovat -1 a hodnotu False nula. Tuto konverzi představuje následující fragment zdrojového kódu:
Dim k As Integer, l As Boolean
l = False
k = CType(l,
Integer)
Me.Text = CStr(k)
Protože proměnná l obsahuje pravdivostní hodnotu False, bude po konverzi v titulkovém pruhu okna aplikace zobrazena nulová hodnota.
Hodnoty proměnných
datového typu String a jejich konverze
Hodnoty proměnných datového typu String lze konvertovat do hodnot proměnných numerických datových typů, samozřejmě za předpokladu, že obsah textového řetězce, jenž je uložen v proměnné typu String, může být převeden do numerické podoby. Prostudujte si tento příklad:
Dim strText As String
Dim
intČíslo As Integer,
intOperace As Integer
strText = "1440"
intČíslo = CType(strText, Integer)
intOperace = (intČíslo * 2) \
100 + 5
Me.Text = CType(intOperace,
String)
Zde je hodnota „1440“ proměnné strText převedena do podoby celého čísla pomocí konverzní funkce CType. Takto získaná numerická hodnota je dále použita v matematické operaci. Nakonec je hodnota proměnné intOperace opět konvertována do hodnoty typu String a uložena do vlastnosti Text aktuální instance formuláře. Popravdě, výpočetní vzorec se vám může zdát poněkud složitý, a proto si jej probereme podrobněji.
Matematický výraz:
intOperace = (intČíslo * 2) \
100 + 5
má následující algoritmus výpočtu:
Přesný průběh výpočtu můžete sledovat na následujícím schématu (na šedém pozadí jsou znázorněné operace s nejvyšší prioritou):
intOperace = (1440 * 2) \ 100 + 5
intOperace = 2880 \ 100 + 5
intOperace = 28 + 5
intOperace = 33
Jak jsme si již ukázali, můžete hodnotu
celočíselné proměnné konvertovat i pomocí operátoru zřetězení (&).Tento program umístí do titulkového pruhu textový řetězec „1 + 1 se
rovná 2“.
Dim
strText As String
= "1 + 1 se rovná "
Dim
intHodnota As Integer
= 2
Me.Text = strText & intHodnota
Pro konverzi textového řetězce do podoby čísla s pohyblivou desetinnou čárkou můžete použít funkci Val. Parametr této funkce přijímá argument ve tvaru textového řetězce a vrací odpovídající hodnotu v podobě čísla datového typu Double.
Dim
strText As String
= "1200.250"
Dim
dblHodnota As Double
dblHodnota = Val(strText)
Debug.WriteLine(dblHodnota)
Funkce Val převede hodnotu textového řetězce na desetinné číslo, které je následně zobrazeno v okně Output. Metoda WriteLine třídy Debug se postará o to, aby se hodnota proměnné dblHodnota objevila v okně Output.
|
Zobrazování hodnot proměnných pomocí metody WriteLine třídy Debug
je velmi užitečné zejména tehdy, když máte aktivovanou volbu Option Strict
a potřebujete okamžitě zjistit hodnotu nějaké proměnné, ale nechcete ji konvertovat
pomocí funkce CType. |
Ján Hanák