Cvičení – prozkoumání přetypování a převodu datových typů
- 30 min
Převod datového typu je možné provést několika technikami. Technika, kterou zvolíte, závisí na vaší odpovědi na dvě důležité otázky:
- Je možné, aby v závislosti na hodnotě došlo při pokusu o změnu datového typu hodnoty k vyvolání výjimky za běhu?
- Je možné, aby v závislosti na hodnotě došlo při pokusu o změnu datového typu hodnoty ke ztrátě informací?
V tomto cvičení si projdete tyto otázky, důsledky jejich odpovědí a techniky, které byste měli použít, když potřebujete změnit datový typ.
Příprava programovacího prostředí
Tento modul obsahuje praktické aktivity, které vás provedou procesem sestavování a spouštění ukázkového kódu. Doporučujeme, abyste tyto aktivity dokončili pomocí editoru Visual Studio Code jako vývojového prostředí. Používání editoru Visual Studio Code pro tyto aktivity vám pomůže stát se pohodlnějším psaním a spouštěním kódu ve vývojářském prostředí, které používají profesionálové po celém světě.
Poznámka:
Pokud jste dokončili další moduly Microsoft Learn v této řadě C#, možná jste už vytvořili složku projektu pro ukázky kódu. V takovém případě můžete přeskočit následující část kroků a odstranit kód v Program.cs souboru použitém pro předchozí cvičení.
Poznámka:
Ukázky kódu v tomto cvičení jsou navrženy na základě nastavení jazykové verze en-US a jako oddělovač desetinných míst použijte tečku (.). Sestavení a spuštění kódu s nastavením jazykové verze, které používá jiné oddělovače desetinných míst (například čárku ,), můžou poskytnout neočekávané výsledky nebo chyby. Pokud chcete tento problém vyřešit, nahraďte oddělovače desetinných míst tečky v ukázkách kódu místním oddělovačem desetinných míst (například ,).
Pokud chcete program spustit pomocí nastavení jazykové verze en-US, přidejte do horní části programu následující kód: using System.Globalization; a za jakékoli další using příkazy přidat CultureInfo.CurrentCulture = new CultureInfo("en-US");.
Otevřete Visual Studio Code.
K otevření editoru Visual Studio Code můžete použít windows nabídka Start (nebo ekvivalentní prostředek pro jiný operační systém).
V nabídce Soubor editoru Visual Studio Code vyberte Otevřít složku.
V dialogovém okně Otevřít složku přejděte do složky Windows Desktop.
Pokud máte jiné umístění složky, kde uchováváte projekty kódu, můžete místo toho použít toto umístění složky. Pro účely tohoto školení je důležité mít umístění, které je snadné najít a zapamatovat.
V dialogovém okně Otevřít složku vyberte Vybrat složku.
Pokud se zobrazí dialogové okno zabezpečení s dotazem, jestli autorům důvěřujete, vyberte Ano.
V nabídce Terminálu editoru Visual Studio Code vyberte Nový terminál.
Všimněte si, že příkazový řádek na panelu Terminálu zobrazuje cestu ke složce pro aktuální složku. Příklad:
C:\Users\someuser\Desktop>Pokud chcete vytvořit novou konzolovou aplikaci v zadané složce, na příkazovém řádku terminálu zadejte:
dotnet new console -o ./CsharpProjects/TestProjecta stiskněte Enter.Tento příkaz rozhraní příkazového řádku .NET používá šablonu programu .NET k vytvoření nového projektu konzolové aplikace jazyka C# v zadaném umístění složky. Příkaz pro vás vytvoří složky CsharpProjects a TestProject a jako název
.csprojsouboru použije TestProject.Na panelu PRŮZKUMNÍK rozbalte složku CsharpProjects .
Měli byste vidět složku TestProject a dva soubory, programový soubor jazyka C# s názvem Program.cs a soubor projektu C# s názvem TestProject.csproj.
Na panelu PRŮZKUMNÍK vyberte Program.cs, abyste zobrazili soubor kódu na panelu Editor.
Odstraňte existující řádky kódu.
Tento projekt konzoly C# slouží k vytváření, sestavování a spouštění ukázek kódu během tohoto modulu.
Zavřete panel Terminálu.
Otázka: Je možné, že pokus o změnu datového typu hodnoty vyvolá výjimku za běhu?
Kompilátor jazyka C# se pokusí přizpůsobit vašemu kódu, ale nekompiluje operace, které by mohly vést k výjimce. Když rozumíte hlavnímu zájmu kompilátoru jazyka C#, je snazší pochopit, proč funguje určitým způsobem.
Napište kód, který se pokusí přidat a intstring uložit výsledek do int
Ujistěte se, že máte visual Studio Code otevřený a Program.cs zobrazený na panelu Editor.
Poznámka:
Program.cs by měl být prázdný. Pokud není, vyberte a odstraňte všechny řádky kódu.
Do editoru visual studio Code zadejte následující kód:
int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);Tady se pokoušíte přidat hodnoty
2a4. Hodnota4je typustring. Bude to fungovat?V nabídce Soubor editoru Visual Studio Code vyberte Uložit.
Soubor Program.cs musí být uložen před sestavením nebo spuštěním kódu.
Na panelu PRŮZKUMNÍK otevřete terminál v umístění složky TestProject, klikněte pravým tlačítkem myši na TestProject a pak vyberte Otevřít v integrovaném terminálu.
Měl by se otevřít panel terminálu a měl by obsahovat příkazový řádek zobrazující, že terminál je otevřený v umístění složky TestProject.
Na příkazovém řádku terminálu zadejte
dotnet runkód a stiskněte Klávesu Enter.Měl by se zobrazit následující přibližný výstup.
C:\Users\someuser\Desktop\csharpprojects\TestProject\Program.cs(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int'Poznámka:
Pokud se zobrazí zpráva "Nepodařilo se najít projekt ke spuštění", ujistěte se, že příkazový řádek terminálu zobrazí očekávané umístění složky TestProject. Příklad:
C:\Users\someuser\Desktop\csharpprojects\TestProject>Chvíli zvažte, proč kompilátor nemohl spustit první vzorový kód.
Důležitá část chybové zprávy ,
(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int'říká, že problém je s použitím datovéhostringtypu.Proč ale kompilátor jazyka C# nemůže chybu zpracovat? Koneckonců můžete udělat opak, abyste zřetězili číslo ke
stringa uložili ho do řetězcové proměnné. Tady změníte datový typresultproměnné zintnastring.Následujícím způsobem aktualizujte kód v editoru visual Studio Code:
int first = 2; string second = "4"; string result = first + second; Console.WriteLine(result);Uložte soubor kódu a pak pomocí editoru Visual Studio Code spusťte svůj kód.
Měli byste sledovat následující výstup:
24Výstup je matematicky nesprávný, ale dokončený tak, že zkombinuje hodnoty jako znaky "2" a "4".
Znovu prozkoumejte první příklad kódu, ve kterém
resultje proměnná typuint. Kód s chybovou zprávou.int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);Proč kompilátor jazyka C# nedokáže zjistit, že chcete zacházet s proměnnou
secondobsahující4jako s číslem, nikoli sstring?
Kompilátory umožňují bezpečné převody.
Kompilátor C# vidí potenciální problém v provedení. Proměnná second je typu string, takže ji můžete nastavit na jinou hodnotu, třeba na "hello". Pokud by se kompilátor C# pokusil převést "hello" na číslo, došlo by k výjimce za běhu. Aby se zabránilo této možnosti, kompilátor jazyka C# implicitně neprovádí převod z stringint do vás.
Z pohledu kompilátoru C# by bylo bezpečnější převést int na string a provést zřetězení.
Pokud chcete ke sčítání použít řetězec, bude od vás kompilátor jazyka C# vyžadovat větší kontrolu při převodu dat. Jinými slovy, nutí vás, abyste se více zapojili a provedli vhodná opatření pro případ, kdy převod vyvolá výjimku.
Pokud potřebujete změnit hodnotu z původního datového typu na nový datový typ a změna by mohla způsobit výjimku za běhu, musíte provést převod dat.
K převodu dat můžete použít různé techniky:
- Použití pomocné metody pro datový typ
- Použití pomocné metody pro proměnnou
-
ConvertPoužití metod třídy
Podívejte se na několik příkladů těchto technik pro převod dat později v této lekci.
Otázka: Je možné, že při pokusu o změnu datového typu hodnoty dojde ke ztrátě informací?
Odstraňte nebo použijte operátor
//komentáře řádku k zakomentování kódu z předchozího kroku cvičení a přidejte následující kód:int myInt = 3; Console.WriteLine($"int: {myInt}"); decimal myDecimal = myInt; Console.WriteLine($"decimal: {myDecimal}");Uložte soubor kódu a pak pomocí editoru Visual Studio Code spusťte svůj kód.
Měl by se zobrazit následující výstup:
int: 3 decimal: 3Klíčem k tomuto příkladu je tento řádek kódu:
decimal myDecimal = myInt;Vzhledem k tomu, že jakákoli hodnota typu
intse snadno vejde do typudecimal, kompilátor převod provede.Rozšiřující převod znamená, že se pokoušíte převést hodnotu z datového typu, která by mohla obsahovat méně informací na datový typ, který může obsahovat více informací. V tomto případě hodnota uložená v proměnné typu
intpřevedená na proměnnou typudecimalneztratí informace.Pokud víte, že provádíte rozšiřující převod, můžete se spolehnout na implicitní převod. Kompilátor zpracovává implicitní převody.
Provedení přetypování
Odstraňte nebo použijte operátor
//komentáře řádku k zakomentování kódu z předchozího kroku cvičení a přidejte následující kód:decimal myDecimal = 3.14m; Console.WriteLine($"decimal: {myDecimal}"); int myInt = (int)myDecimal; Console.WriteLine($"int: {myInt}");Chcete-li provést přetypování, pomocí operátoru
()přetypování uzavřete datový typ a pak ho umístěte vedle proměnné, kterou chcete převést (příklad:(int)myDecimal). Provedete explicitní převod na datový typ, který je definován pro přetypování (int).Uložte soubor kódu a pak pomocí editoru Visual Studio Code spusťte svůj kód.
Měl by se zobrazit následující výstup:
decimal: 3.14 int: 3Klíčem k tomuto příkladu je tento řádek kódu:
int myInt = (int)myDecimal;Proměnná
myDecimalobsahuje hodnotu, která má přesnost za desetinnou čárkou. Přidáním instrukce(int)přetypování říkáte kompilátoru jazyka C#, že víte, že je možné, že tuto přesnost ztratíte, a v této situaci je to v pořádku. Kompilátoru říkáte, že provádíte úmyslný převod, explicitní převod.
Určení, jestli je převod "rozšiřující převod" nebo "zužující převod"
Zužující převod znamená, že se pokoušíte převést hodnotu z datového typu, která může obsahovat více informací na datový typ, který může obsahovat méně informací. V takovém případě může dojít ke ztrátě informací, jako je třeba přesnost (tj. počet hodnot za desetinnou čárkou). Příkladem je převod hodnoty uložené v proměnné typu decimal na proměnnou typu int. Pokud vytisknete dvě hodnoty, pravděpodobně byste si všimli ztráty informací.
Pokud víte, že provádíte zužující převod, musíte provést přetypování. Přetypováním dáte kompilátoru jazyka C# pokyn, že víte o možné ztrátě přesnosti, ale jste ochotni ji akceptovat.
Pokud si nejste jistí, jestli při převodu ztratíte data, napište kód, který provede převod dvěma různými způsoby, a sledujte změny. Vývojáři často píší malé testy, aby lépe pochopili chování, jak je znázorněno v další ukázce.
Odstraňte nebo použijte operátor
//komentáře řádku k zakomentování kódu z předchozího kroku cvičení a přidejte následující kód:decimal myDecimal = 1.23456789m; float myFloat = (float)myDecimal; Console.WriteLine($"Decimal: {myDecimal}"); Console.WriteLine($"Float : {myFloat}");Uložte soubor kódu a pak pomocí editoru Visual Studio Code spusťte svůj kód.
Zobrazený výstup by měl vypadat přibližně takto:
Decimal: 1.23456789 Float : 1.2345679Z výstupu můžete vidět, že přetypování
decimalnafloatzúžení převodu je zužující, protože ztrácíte přesnost.
Provádění převodů dat
Dříve bylo uvedeno, že změna hodnoty z jednoho datového typu na jiný by mohla způsobit výjimku za běhu a měli byste provést převod dat. Pro převody dat existují tři techniky, které můžete použít:
- Použití pomocné metody pro proměnnou
- Použití pomocné metody pro datový typ
-
ConvertPoužití metod třídy
Slouží ToString() k převodu čísla na string
Každá proměnná datového typu má metodu ToString(). Co metoda ToString() dělá, závisí na tom, jak je v daném typu implementovaná. U většiny primitivních hodnot se provede rozšiřující konverze. I když to není nezbytně nutné (protože ve většině případů se můžete spolehnout na implicitní převod), může komunikovat s ostatními vývojáři, že rozumíte tomu, co děláte, a je záměrný.
Tady je krátký příklad použití metody ToString() k explicitnímu převodu hodnot typu int na typ string.
Odstraňte nebo použijte operátor
//komentáře řádku k zakomentování kódu z předchozího kroku cvičení a přidejte následující kód:int first = 5; int second = 7; string message = first.ToString() + second.ToString(); Console.WriteLine(message);Uložte soubor kódu a pak pomocí editoru Visual Studio Code spusťte svůj kód. Při spuštění kódu by měl výstup zobrazit zřetězení dvou hodnot:
57
string Převedení na int metodu pomocné rutiny Parse()
Většina číselných datových typů má metodu Parse() , která převede řetězec na daný datový typ. V tomto případě pomocí Parse() metody převedete dva řetězce na int hodnoty a pak je sečtete dohromady.
Odstraňte nebo použijte operátor
//komentáře řádku k zakomentování kódu z předchozího kroku cvičení a přidejte následující kód:string first = "5"; string second = "7"; int sum = int.Parse(first) + int.Parse(second); Console.WriteLine(sum);Uložte soubor kódu a pak pomocí editoru Visual Studio Code spusťte svůj kód. Při spuštění kódu by měl výstup zobrazit součet těchto dvou hodnot:
12Zkuste si chvíli pokusit zjistit potenciální problém s předchozím příkladem kódu? Co když je jedna z proměnných
firstnebosecondnastavená na hodnoty, které se nedají převést naint? Za běhu se vyvolá výjimka. Kompilátor a modul runtime jazyka C# očekává, že plánujete dopředu a zabráníte "nelegálním" převodům. Výjimku modulu runtime můžete zmírnit několika způsoby.Nejjednodušší způsob, jak tuto situaci zmírnit, je použití
TryParse(), což je lepší verzeParse()metody.
Převod třídy stringint na třídu Convert
Třída Convert má mnoho pomocných metod pro převod hodnoty z jednoho typu do druhého. V následujícím příkladu kódu převedete několik řetězců na hodnoty typu int.
Odstraňte nebo použijte operátor
//komentáře řádku k zakomentování kódu z předchozího kroku cvičení a přidejte následující kód:string value1 = "5"; string value2 = "7"; int result = Convert.ToInt32(value1) * Convert.ToInt32(value2); Console.WriteLine(result);Uložte soubor kódu a pak pomocí editoru Visual Studio Code spusťte svůj kód.
Měl by se zobrazit následující výstup:
35Poznámka:
Proč se metoda jmenuje
ToInt32()? Proč se nejmenujeToInt()?System.Int32je název podkladového datového typu v knihovně tříd .NET, který programovací jazyk C# mapuje na klíčové slovoint. Protože třídaConvertje také součástí knihovny tříd .NET, je volána svým úplným názvem, nikoli názvem C#. Definováním datových typů v knihovně tříd .NET Framework může více jazyků .NET, jako je Visual Basic, F#, IronPython a další, sdílet stejné datové typy a stejné třídy v knihovně tříd .NET.Metoda
ToInt32()má 19 přetížených verzí, což umožňuje přijmout prakticky každý datový typ.použili jste metodu
Convert.ToInt32()s řetězcem zde, ale pravděpodobně byste měli použítTryParse(), pokud je to možné.Kdy byste tedy měli použít
Converttřídu? TřídaConvertje nejvhodnější pro převod desetinných čísel na celá čísla (int), protože zaokrouhluje směrem nahoru, který byste očekávali.
Porovnání přetypování a převodu na decimalint
Následující příklad ukazuje, co se stane, když se pokusíte přetypovat typ decimal na typ int (zužující převod) a když pomocí metody Convert.ToInt32() převedete stejný typ decimal na typ int.
Odstraňte nebo použijte operátor
//komentáře řádku k zakomentování kódu z předchozího kroku cvičení a přidejte následující kód:int value = (int)1.5m; // casting truncates Console.WriteLine(value); int value2 = Convert.ToInt32(1.5m); // converting rounds up Console.WriteLine(value2);Uložte soubor kódu a pak pomocí editoru Visual Studio Code spusťte svůj kód.
Měl by se zobrazit následující výstup:
1 2
Přetypování zkracuje a převádí kola.
Při přetypování int value = (int)1.5m;se hodnota float zkrátí, takže výsledek je 1, což znamená, že hodnota za desetinnou čárkou je zcela ignorována. Literál float můžete změnit na 1.999m výsledek přetypování a výsledek přetypování by byl stejný.
Při převodu pomocí Convert.ToInt32()se hodnota literálu float správně zaokrouhlí nahoru na 2hodnotu . Pokud jste změnili hodnotu literálu na 1.499m, bylo by zaokrouhleno dolů na 1.
Rekapitulace
Probrali jste několik důležitých konceptů převodu a přetypování dat:
- Zabránění chybě za běhu při převodu dat
- Explicitní přetypování sdělte kompilátoru, že rozumíte riziku ztráty dat.
- Při provádění rozšiřujícího převodu závisí na kompilátoru, aby provedl implicitní přetypování.
-
()K provedení přetypování (například(int)myDecimal) použijte operátor přetypování a datový typ. -
ConvertTřídu použijte, pokud chcete provést zužující převod, ale chcete provést zaokrouhlení, nikoli zkrácení informací.