Exerciții - Explorarea și conversia tipului de date
- 30 minute
Există mai multe tehnici pentru a efectua o conversie a tipului de date. Tehnica aleasă depinde de răspunsul dvs. la două întrebări importante:
- Este posibil, în funcție de valoarea, care încearcă să modifice tipul de date al valorii ar genera o excepție la momentul rulării?
- Este posibil, în funcție de valoare, că încercarea de a modifica tipul de date al valorii ar duce la o pierdere de informații?
În acest exercițiu, vă străduiți să parcurgeți aceste întrebări, implicațiile răspunsurilor lor și tehnica pe care ar trebui să o utilizați atunci când trebuie să modificați tipul de date.
Pregătirea mediului de codificare
Acest modul include activități practice care vă ghidează în procesul de creare și de rulare a codului demonstrativ. Sunteți încurajat să finalizați aceste activități utilizând Visual Studio Code ca mediu de dezvoltare. Utilizarea Codului Visual Studio pentru aceste activități vă ajută să deveniți mai confortabil să scrieți și să rulați cod într-un mediu de dezvoltator utilizat de profesioniști din întreaga lume.
Notă
Dacă ați finalizat alte module Microsoft Learn din această serie C#, este posibil să fi creat deja un folder de proiect pentru eșantioane de cod. Dacă acesta este cazul, puteți să omiteți următoarea secțiune de pași și să ștergeți codul din fișierul Program.cs utilizat pentru un exercițiu anterior.
Notă
Eșantioanele de cod din acest exercițiu sunt proiectate pe baza setărilor de cultură en-US și utilizează un punct (.) ca separator zecimal. Construirea și rularea codului cu o setare de cultură care utilizează un separator zecimal diferit (cum ar fi o virgulă ,) poate oferi rezultate sau erori neașteptate. Pentru a remedia această problemă, înlocuiți separatorii de perioadă zecimală din eșantioanele de cod cu separatorul zecimal local (cum ar fi ,).
Ca alternativă, pentru a rula un program utilizând setarea de cultură en-US, adăugați următorul cod în partea de sus a programului: using System.Globalization; și, după orice alte instrucțiuni de using, adăugați CultureInfo.CurrentCulture = new CultureInfo("en-US");.
Deschideți Visual Studio Code.
Puteți utiliza meniul Start Windows (sau resursa echivalentă pentru un alt sistem de operare) pentru a deschide Visual Studio Code.
În meniul Fișier Visual Studio Code, selectați Deschidere folder.
În caseta de dialog Deschidere folder, navigați la folderul Desktop Windows.
Dacă aveți o locație de folder diferită în care păstrați proiecte de cod, puteți utiliza acea locație de folder în schimb. Pentru această instruire, lucrul important este să aveți o locație ușor de găsit și de reținut.
În caseta de dialog Deschidere folder, selectați Selectare folder.
Dacă vedeți o casetă de dialog de securitate care vă întreabă dacă aveți încredere în autori, selectați Da.
În meniul Terminal Visual Studio Code, selectați Terminal nou .
Observați că o linie de comandă din panoul Terminal afișează calea folderului pentru folderul curent. De exemplu:
C:\Users\someuser\Desktop>Pentru a crea o aplicație consolă nouă într-un folder specificat, în linia de comandă Terminal tastați:
dotnet new console -o ./CsharpProjects/TestProjectapoi apăsați pe Enter.Această comandă .NET CLI utilizează un șablon de program .NET pentru a crea un nou proiect de aplicație consolă C# în locația de folder specificată. Comanda creează folderele CsharpProjects și TestProject pentru dvs. și utilizează TestProject ca nume al fișierului
.csproj.În panoul EXPLORER, extindeți folderul CsharpProjects.
Ar trebui să vedeți folderul TestProject și două fișiere, un fișier program C# denumit Program.cs și un fișier proiect C# numit TestProject.csproj.
În panoul EXPLORER, pentru a vizualiza fișierul de cod în panoul Editor, selectați Program.cs.
Ștergeți liniile de cod existente.
Utilizați acest proiect de consolă C# pentru a crea, a construi și a rula eșantioane de cod în timpul acestui modul.
Închideți panoul Terminal.
Întrebare: Este posibil ca încercarea de modificare a tipului de date al valorii să genereze o excepție la momentul rulării?
Compilatorul C# încearcă să acomodeze codul, dar nu compilează operațiuni care ar putea avea ca rezultat o excepție. Atunci când înțelegeți preocuparea principală a compilatorului C#, înțelegerea motivelor pentru care funcționează într-un anumit mod este mai simplă.
Scrieți cod care încearcă să adauge o int și o string și să salveze rezultatul într-o int
Asigurați-vă că aveți visual Studio Code deschis și Program.cs afișat în panoul Editor.
Notă
Program.cs ar trebui să fie goală. Dacă nu este, selectați și ștergeți toate liniile de cod.
Tastați următorul cod în Visual Studio Code Editor:
int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);Aici încercați să adăugați valorile
2și4. Valoarea4este de tipulstring. Va funcționa acest lucru?În meniul Fișier Visual Studio Code, selectați Salvare.
Fișierul Program.cs trebuie salvat înainte de construirea sau rularea codului.
În panoul EXPLORER, pentru a deschide un Terminal la locația folderului TestProject, faceți clic dreapta pe TestProject, apoi selectați Deschidere în terminal integrat.
Un panou terminal ar trebui să se deschidă și ar trebui să includă o linie de comandă care arată că Terminal este deschis la locația folderului TestProject.
În linia de comandă Terminal, pentru a rula codul, tastați
dotnet runapoi apăsați pe Enter.Ar trebui să vedeți următoarea ieșire aproximativă
C:\Users\someuser\Desktop\csharpprojects\TestProject\Program.cs(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int'Notă
Dacă vedeți un mesaj care spune "Nu s-a găsit un proiect de rulat", asigurați-vă că linia de comandă Terminal afișează locația așteptată a folderului TestProject. De exemplu:
C:\Users\someuser\Desktop\csharpprojects\TestProject>Luați un minut pentru a lua în considerare motivul pentru care compilatorul nu a reușit să ruleze primul eșantion de cod.
Partea importantă a mesajului de eroare,
(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int', vă spune că problema este utilizarea tipului de datestring.Dar de ce nu poate compilatorul C# să gestioneze eroarea? La urma urmei, puteți face opusă pentru a concatena un număr la un
stringși a-l salva într-o variabilă șir. Aici modificați tipul de date al variabileiresultde laintlastring.Actualizați codul în Visual Studio Code Editor după cum urmează:
int first = 2; string second = "4"; string result = first + second; Console.WriteLine(result);Salvați fișierul de cod, apoi utilizați Visual Studio Code pentru a rula codul.
Ar trebui să observați următoarea ieșire:
24Rezultatul este incorect din punct de vedere matematic, dar completează combinând valorile ca caractere "2" și "4".
Examinați, încă o dată, primul exemplu de cod în care variabila
resulteste de tipint. Codul cu mesajul de eroare.int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);De ce nu poate compilatorul C# să se dea seama că doriți să tratați variabila
secondcare conține4ca număr, nu unstring?
Compilatorii fac conversii sigure
Compilatorul C# vede o problemă potențială în luare. Variabila second este de tip string, deci poate fi setată la o altă valoare, cum ar fi "hello". Dacă compilatorul C# a încercat să efectueze conversia "hello" la un număr care ar determina o excepție la momentul rulării. Pentru a evita această posibilitate, compilatorul C# nu efectuează în mod implicit conversia de la string la int pentru dvs.
Din perspectiva compilatorului C#, operațiunea mai sigură ar fi conversia int într-o string și efectuarea concatenării.
Dacă intenționați să efectuați adăugarea utilizând un șir, compilatorul C# vă solicită să preluați un control mai explicit asupra procesului de conversie a datelor. Cu alte cuvinte, vă obligă să fiți mai implicat, astfel încât să puteți pune în aplicare măsurile de precauție corespunzătoare pentru a gestiona posibilitatea ca conversia să genereze o excepție.
Dacă trebuie să modificați o valoare din tipul de date original cu un nou tip de date, iar modificarea poate genera o excepție la momentul rulării, trebuie să efectuați o conversie de date .
Pentru a efectua conversia datelor, puteți utiliza una dintre mai multe tehnici:
- Utilizarea unei metode de ajutor pentru tipul de date
- Utilizarea unei metode de ajutor pentru variabilă
- Utilizarea metodelor clasei
Convert
Priviți câteva exemple ale acestor tehnici pentru conversia datelor mai târziu în această unitate.
Întrebare: Este posibil ca încercarea de modificare a tipului de date al valorii să ducă la pierderea informațiilor?
Ștergeți sau utilizați operatorul de comentarii de linie
//pentru a comenta codul din pasul anterior de exercițiu și adăugați următorul cod:int myInt = 3; Console.WriteLine($"int: {myInt}"); decimal myDecimal = myInt; Console.WriteLine($"decimal: {myDecimal}");Salvați fișierul de cod, apoi utilizați Visual Studio Code pentru a rula codul.
Ar trebui să vedeți următoarea ieșire:
int: 3 decimal: 3Cheia pentru acest exemplu este această linie de cod:
decimal myDecimal = myInt;Deoarece orice valoare
intse poate încadra cu ușurință într-odecimal, compilatorul efectuează conversia.Termenul lărgirea de conversie înseamnă că încercați să efectuați conversia unei valori dintr- un tip de date care ar putea conține mai puțin informații pentru a un tip de date care poate conține mai multe informații. În acest caz, o valoare stocată într-o variabilă de tip
intconvertită într-o variabilă de tipdecimal, nu pierde informațiile.Atunci când știți că efectuați o conversie de lărgire, vă puteți baza pe de conversie implicită. Compilatorul gestionează conversiile implicite.
Efectuarea unei distribuții
Ștergeți sau utilizați operatorul de comentarii de linie
//pentru a comenta codul din pasul anterior de exercițiu și adăugați următorul cod:decimal myDecimal = 3.14m; Console.WriteLine($"decimal: {myDecimal}"); int myInt = (int)myDecimal; Console.WriteLine($"int: {myInt}");Pentru a efectua o distribuție, utilizați operatorul de difuzare
()pentru a încadra un tip de date, apoi plasați-l lângă variabila pe care doriți să o convertiți (exemplu:(int)myDecimal). Efectuați o conversie explicită la tipul de date definit (int).Salvați fișierul de cod, apoi utilizați Visual Studio Code pentru a rula codul.
Ar trebui să vedeți următoarea ieșire:
decimal: 3.14 int: 3Cheia pentru acest exemplu este această linie de cod:
int myInt = (int)myDecimal;Variabila
myDecimalconține o valoare care are precizie după virgula zecimală. Prin adăugarea instrucțiunii de turnare(int), spuneți compilatorului C# că înțelegeți că este posibil să pierdeți acea precizie și, în această situație, este bine. Spuneți compilatorului că efectuați o conversie intenționată, o conversie explicită.
Determinați dacă conversia este o "conversie de lărgire" sau o "conversie de restrângere"
Termenul restrângerea conversiei înseamnă că încercați să efectuați conversia unei valori dintr-un tip de date care poate conține mai multe informații la un tip de date care poate conține mai puține informații. În acest caz, este posibil să pierdeți informații precum precizia (adică numărul de valori de după virgula zecimală). Un exemplu face conversia valorii stocate într-o variabilă de tip decimal într-o variabilă de tip int. Dacă imprimați cele două valori, este posibil să observați pierderea de informații.
Atunci când știți că efectuați o conversie de îngustare, trebuie să efectuați o de distribuție. Turnarea este o instrucțiune a compilatorului C# că știți că precizia poate fi pierdută, dar sunteți dispus să acceptați acest lucru.
Dacă nu sunteți sigur dacă pierdeți datele din conversie, scrieți cod pentru a efectua o conversie în două moduri diferite și a observa modificările. Dezvoltatorii scriu frecvent mici teste pentru a înțelege mai bine comportamentele, după cum este ilustrat cu următorul eșantion.
Ștergeți sau utilizați operatorul de comentarii de linie
//pentru a comenta codul din pasul anterior de exercițiu și adăugați următorul cod:decimal myDecimal = 1.23456789m; float myFloat = (float)myDecimal; Console.WriteLine($"Decimal: {myDecimal}"); Console.WriteLine($"Float : {myFloat}");Salvați fișierul de cod, apoi utilizați Visual Studio Code pentru a rula codul.
Ar trebui să vedeți ieșirea similară cu:
Decimal: 1.23456789 Float : 1.2345679Puteți observa de la rezultatul care casting un
decimalîntr-ofloateste o conversie îngustă, deoarece pierde precizie.
Efectuarea conversiilor de date
Mai devreme, s-a menționat că o modificare de valoare dintr-un tip de date într-altul poate cauza o excepție la momentul rulării și ar trebui să efectuați conversia datelor. Pentru conversiile de date, există trei tehnici pe care le puteți utiliza:
- Utilizarea unei metode de ajutor pentru variabilă
- Utilizarea unei metode de ajutor pentru tipul de date
- Utilizarea metodelor clasei
Convert
Utilizați ToString() pentru a efectua conversia unui număr într-o string
Fiecare variabilă de tip de date are o metodă de ToString(). Metoda de ToString() depinde de modul în care este implementată pe un anumit tip. Cu toate acestea, pe majoritatea primitivelor, efectuează o conversie de lărgire. Deși acest lucru nu este strict necesar (deoarece vă puteți baza pe conversia implicită în majoritatea cazurilor), acesta poate comunica altor dezvoltatori că înțelegeți ce faceți și este intenționat.
Iată un exemplu rapid de utilizare a metodei ToString() pentru a efectua în mod explicit conversia valorilor int în strings.
Ștergeți sau utilizați operatorul de comentarii de linie
//pentru a comenta codul din pasul anterior de exercițiu și adăugați următorul cod:int first = 5; int second = 7; string message = first.ToString() + second.ToString(); Console.WriteLine(message);Salvați fișierul de cod, apoi utilizați Visual Studio Code pentru a rula codul. Atunci când rulați codul, rezultatul ar trebui să afișeze o concatenare a celor două valori:
57
Conversia unui string într-o int utilizând metoda de ajutor Parse()
Majoritatea tipurilor de date numerice au o metodă de Parse(), care efectuează conversia unui șir în tipul de date dat. În acest caz, utilizați metoda Parse() pentru a efectua conversia a două șiruri în valori int, apoi a le aduna.
Ștergeți sau utilizați operatorul de comentarii de linie
//pentru a comenta codul din pasul anterior de exercițiu și adăugați următorul cod:string first = "5"; string second = "7"; int sum = int.Parse(first) + int.Parse(second); Console.WriteLine(sum);Salvați fișierul de cod, apoi utilizați Visual Studio Code pentru a rula codul. Atunci când rulați codul, rezultatul ar trebui să afișeze o sumă a celor două valori:
12Încercați să depistați problema potențială cu exemplul anterior de cod? Ce se întâmplă dacă oricare dintre variabilele
firstsausecondsunt setate la valori care nu pot fi convertite într-oint? S-a produs o excepție la momentul rulării. Compilatorul C# și modulul runtime vă așteaptă să planificați înainte și să preveniți conversiile "ilegale". Puteți atenua excepția runtime în mai multe moduri.Cea mai simplă modalitate de a atenua această situație este utilizarea
TryParse(), care este o versiune mai bună a metodeiParse().
Conversia unui string într-o int utilizând clasa de Convert
Clasa Convert are multe metode de ajutor pentru a efectua conversia unei valori dintr-un tip în altul. În următorul exemplu de cod, efectuați conversia câtorva șiruri în valori de tip int.
Ștergeți sau utilizați operatorul de comentarii de linie
//pentru a comenta codul din pasul anterior de exercițiu și adăugați următorul cod:string value1 = "5"; string value2 = "7"; int result = Convert.ToInt32(value1) * Convert.ToInt32(value2); Console.WriteLine(result);Salvați fișierul de cod, apoi utilizați Visual Studio Code pentru a rula codul.
Ar trebui să vedeți următoarea ieșire:
35Notă
De ce este numele metodei
ToInt32()? De ce nuToInt()?System.Int32este numele tipului de date subiacent din Biblioteca de clasă .NET pe care limbajul de programare C# o mapează laintcuvânt cheie. Deoarece clasaConvertface parte, de asemenea, din Biblioteca de clasă .NET, este apelată de numele complet, nu de numele său C#. Prin definirea tipurilor de date ca parte a Bibliotecii de clase .NET, mai multe limbi .NET, cum ar fi Visual Basic, F#, IronPython și altele pot partaja aceleași tipuri de date și aceleași clase în Biblioteca de clase .NET.Metoda
ToInt32()are 19 versiuni supraîncărcate, permițându-i să accepte practic fiecare tip de date.ați utilizat metoda
Convert.ToInt32()cu un șir aici, dar probabil că ar trebui să utilizațiTryParse()atunci când este posibil.Când ar trebui să folosești clasa
Convert? ClasaConverteste cea mai bună pentru conversia numerelor fracționare în numere întregi (int) deoarece rotunjește în sus așa cum vă așteptați.
Comparați distribuția și conversia unui decimal într-o int
Următorul exemplu demonstrează ce se întâmplă atunci când încercați să transformați o decimal într-o int (o conversie îngustă) comparativ cu utilizarea metodei de Convert.ToInt32() pentru a efectua conversia acelorași decimal într-o int.
Ștergeți sau utilizați operatorul de comentarii de linie
//pentru a comenta codul din pasul anterior de exercițiu și adăugați următorul cod:int value = (int)1.5m; // casting truncates Console.WriteLine(value); int value2 = Convert.ToInt32(1.5m); // converting rounds up Console.WriteLine(value2);Salvați fișierul de cod, apoi utilizați Visual Studio Code pentru a rula codul.
Ar trebui să vedeți următoarea ieșire:
1 2
Turnarea trunchiază și convertește rotunjirile
Atunci când distribuiți int value = (int)1.5m;, valoarea flotant este trunchiată, astfel încât rezultatul este 1, ceea ce înseamnă că valoarea după ce vi se ignoră complet virgula zecimală. Ai putea schimba literal float la 1.999m și rezultatul de casting ar fi același.
Atunci când efectuați conversia utilizând Convert.ToInt32(), valoarea flotant literală este rotunjită corect la 2. Dacă ați modificat valoarea literală în 1.499m, ar fi rotunjită în jos la 1.
Recapitula
Ați acoperit mai multe concepte importante despre conversia și turnarea datelor:
- Prevenirea unei erori la momentul rulării în timpul efectuării unei conversii de date
- Efectuați o difuzare explicită pentru a spune compilatorului că înțelegeți riscul de a pierde date
- Bazați-vă pe compilator pentru a efectua o difuzare implicită atunci când efectuați o conversie extinsă
- Utilizați operatorul de distribuție
()și tipul de date pentru a efectua o difuzare (de exemplu,(int)myDecimal) - Utilizați clasa de
Convertatunci când doriți să efectuați o conversie de îngustare, dar doriți să efectuați rotunjirea, nu trunchierea informațiilor
Verificați-vă cunoștințele
Feedback
Această pagină a fost utilă?
Nu
Aveți nevoie de ajutor cu acest subiect?
Doriți să încercați să utilizați Întrebați Microsoft Learn pentru a clarifica sau primi îndrumări privind acest subiect?