Veľmi častou úlohou pri programovaní je previesť text na číslo alebo dátum. Najčastejšie pri spracovaní vstupu od užívateľa, alebo spracovaní vystupných dát, ktoré nie sú „strongly typed“ (teda nenesú informácie o dátových typoch).
V .NET 1.0 a 1.1 sa používala načastejšie trieda Convert, ktorá obsahuje statické metódy pre konverziu medzi jednoduchými dátovými typmi (čísla, dátumy, logické hodnoty).
Problém nastáva v zložitom manažmente týchto konverzií. Ak sa totiž argument nedá previesť na daný dátový typ, tak vyhodia výnimku. Tzn. že celý blok kódu treba obaliť do try{} catch{}, ktoré zbytočne znižujú výkonnosť programu.
.NET 2.0 prináša nový prístup ku konverzii základných dátových
typov. Je oveľa pohodlnejší a vyžaduje menej systémových prostriedkov.
Stará koncepcia je totiž zlá – výnimky by sa mali používať naozaj vo
výnimočnom prípade. Ak však užívateľ zadáva vo WinForm
aplikácii do TextBoxu číslo a zadá ho zle, tak sa dosť časť nejde
o výnimočný prípad .
Preto existuje v .NET 2.0 v každom základnom dátovom type metóda TryParse(). Ako názov napovedá, metóda sa pokúsi spracovať zadaný vstup. Ak sa jej to podarí, vráti true, v opačnom prípade false. Čo však s konvertovanou hodnotou? Metóda má len návrtovú hodnotu bool… Použiť na vstupný text jednu z metód z Convert v bloku if() po úspešnom spracovaní textu metódou TryParse() by bolo jedno z riešení. Je vša neefektívne, pretože dochádza k dvojnásobnému spracovaniu vstupných dát.
Metóda TryParse() má parameter výstupný (out). Ide o premennú, do ktorej bude uložená skonvertovaná hodnota, ak bude konverzia úspešná. Toľko teória a teraz jeden jasný príklad:
int vek;
string input;
Console.Write(„Zadajte Váš vek: ");
input = Console.ReadLine();
if (Int32.TryParse(input, out vek))
{
// správne zadané číslo, od dnešného datáumu odpočítame roky
DateTime rokNarodenia = DateTime.Today.AddYears(-vek);
Console.WriteLine(“Narodili ste sa v roku {0}.„,
rokNarodenia.Year
);
}
else
{
Console.WriteLine(“Prosím, zadajte číslo.");
}
Zdrojový kód programu: TryParse.cs.
Ukážku je možné vylepšiť o pridanie parametru NumberStyles.None, ktorý neumožňí spracovaniezáporného čísla. TryParse() by vyzeral takto:
Int32.TryParse(
input,
System.Globalization.NumberStyles.None,
System.Globalization.CultureInfo.CurrentCulture.NumberFormat,
out vek)
Paramater CurrentCulture.NumberFormat podľa aktuálneho
jazyka poskytne metóde informácie o kladnom, zápornom alebo desatinnom
znamienku v číslach v aktuálnom jazyku (a aj ostatné dôležité
informácie o číslach).
pALI G says:
Len tak dalej… PRAVIDELNE!!!