Harjoitus – Tutustu tietotyyppien valamiseen ja muuntamiseen
- 30 minuuttia
Tietotyyppimuunnon suorittamiseen on useita tekniikoita. Valitsemasi tekniikka riippuu vastauksestasi kahteen tärkeään kysymykseen:
- Onko arvon mukaan mahdollista, että arvon tietotyypin muuttaminen aiheuttaa poikkeuksen suorituksen aikana?
- Onko arvosta riippuen mahdollista, että arvon tietotyypin muuttaminen johtaisi tietojen menettämiseen?
Tässä harjoituksessa käyt läpi nämä kysymykset, niiden vastausten vaikutukset ja sen, mitä tekniikkaa sinun tulee käyttää, kun sinun on muutettava tietotyyppiä.
Koodausympäristön valmisteleminen
Tämä moduuli sisältää käytännönläheisiä toimintoja, jotka opastavat esittelykoodin luonti- ja suorittamisprosessissa. Sinua kehotetaan suorittamaan nämä toimet käyttämällä Visual Studio Codea kehitysympäristönäsi. Visual Studio Coden avulla näitä toimintoja varten voit tutustua paremmin koodin kirjoittamiseen ja suorittamiseen kehittäjäympäristössä, jota ammattilaiset ympäri maailmaa käyttävät.
Muistiinpano
Jos olet suorittanut muita Microsoft Learn -moduuleja tässä C#-sarjassa, olet ehkä jo luonut projektikansion koodinäytteitä varten. Tässä tapauksessa voit ohittaa seuraavan vaiheen ja poistaa edellisessä harjoituksessa käytetyn Program.cs tiedoston koodin.
Muistiinpano
Tämän harjoituksen koodinäytteet on suunniteltu en-US maa-asetusten perusteella ja käyttävät desimaalierottimena pistettä (.). Koodin luominen ja suorittaminen maa-asetus, joka käyttää erilaisia desimaalierottimia (kuten pilkku ,), voi tuottaa odottamattomia tuloksia tai virheitä. Voit korjata ongelman korvaamalla koodinäytteiden pistedesimaalierottimet paikallisella desimaalierottimella (kuten ,).
Vaihtoehtoisesti voit suorittaa ohjelman käyttämällä en-US maa-asetusta lisäämällä seuraavan koodin ohjelmasi yläosaan: using System.Globalization; ja muiden using lausekkeiden jälkeen lisää CultureInfo.CurrentCulture = new CultureInfo("en-US");.
Avaa Visual Studio Code.
Voit avata Visual Studio Coden Windowsin Käynnistä-valikon (tai toisen käyttöjärjestelmän vastaavan resurssin) avulla.
Valitse Visual Studio Code Tiedoston -valikosta Avaa kansio -.
Siirry Avaa kansio -valintaikkunassa Windows Desktop -kansioon.
Jos sinulla on eri kansiosijainti, jossa säilytät koodiprojekteja, voit käyttää sen sijaan kyseisen kansion sijaintia. Tätä koulutusta varten on tärkeää saada sijainti, joka on helppo paikantaa ja muistaa.
Valitse Avaa kansio -valintaikkunassa Valitse kansio.
Jos näyttöön tulee suojausvalintaikkuna, jossa kysytään, luotatko tekijöihin, valitse Kyllä.
Valitse Visual Studio Code Terminal -valikosta Uusi pääte -.
Huomaa, että päätepaneelin komentokehote näyttää nykyisen kansion kansiopolun. Esimerkiksi:
C:\Users\someuser\Desktop>Jos haluat luoda uuden konsolisovelluksen määritettyyn kansioon, valitse Terminal-komentokehotetyyppi:
dotnet new console -o ./CsharpProjects/TestProjectja paina enter-näppäintä.Tämä .NET CLI -komento luo .NET-ohjelmamallin avulla uuden C#-konsolisovellusprojektin määritettyyn kansiosijaintiin. Komento luo puolestasi CsharpProjects- ja TestProject-kansiot ja käyttää
.csprojniminä TestProject-projektia.Laajenna EXPLORER-paneelin CsharpProjects--kansion.
Sinun pitäisi nähdä TestProject-kansio ja kaksi tiedostoa, C#-ohjelmatiedosto nimeltä Program.cs ja C#-projektitiedosto nimeltä TestProject.csproj.
Jos haluat tarkastella kooditiedostoa Editorin paneelissa EXPLORER-paneelissa, valitse Program.cs.
Poista olemassa olevat koodirivit.
Tämän moduulin aikana voit luoda, luoda ja suorittaa koodinäytteitä tämän C#-konsoliprojektin avulla.
Sulje Päätepaneeli.
Kysymys: Onko mahdollista, että arvon tietotyypin muuttaminen aiheuttaa poikkeuksen suorituksen aikana?
C#-kääntäjä yrittää mukauttaa koodiasi, mutta ei käännä toimintoja, jotka voisivat aiheuttaa poikkeuksen. Kun ymmärrät C#-kääntäjän ensisijaisen huolenaiheen, on helpompi ymmärtää, miksi se toimii tietyllä tavalla.
Kirjoita koodi, joka yrittää lisätä int ja string ja tallentaa tuloksen int
Varmista, että Visual Studio Code on avoinna ja Program.cs näkyvissä editorin paneelissa.
Muistiinpano
Program.cs pitäisi olla tyhjä. Jos ei ole, valitse ja poista kaikki koodirivit.
Kirjoita seuraava koodi Visual Studio Code Editoriin:
int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);Tässä yrität lisätä arvot
2ja4. Arvo,4on tyyppiästring. Toimiiko tämä?Valitse Visual Studio Code Tiedoston -valikosta Tallenna.
Program.cs tiedosto on tallennettava ennen koodin rakentamista tai suorittamista.
Avaa EXPLORER-paneelin TestProject-kansion sijainnissa Terminal napsauttamalla hiiren kakkospainikkeella TestProjectja valitsemalla sitten Avaa Integroidussa päätteessä -.
Terminal-paneelin pitäisi avautua, ja siinä pitäisi olla komentokehote, joka näyttää, että Terminal on avoinna TestProject-kansiosi sijainnissa.
Suorita koodi Terminal-komentokehotteessa kirjoittamalla
dotnet runja painamalla enter-näppäintä.Sinun pitäisi nähdä seuraava arvioitu tulos
C:\Users\someuser\Desktop\csharpprojects\TestProject\Program.cs(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int'Muistiinpano
Jos näyttöön tulee sanoma "Suoritettavaa projektia ei löytynyt", varmista, että Terminal-komentokehote näyttää odotetun TestProject-kansion sijainnin. Esimerkki:
C:\Users\someuser\Desktop\csharpprojects\TestProject>Mieti hetki, miksi kääntäjä ei pystynyt suorittamaan ensimmäistä koodiesimerkkiä.
Virhesanoman
(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int'tärkeä osa kertoo, ettästringtietotyypin käytössä on ongelma.Miksi C#-kääntäjä ei voi vain käsitellä virhettä? Voit kuitenkin toisin kuin liittääksesi luvun
stringja tallentaaksesi sen merkkijonomuuttujaan. Tässä voit muuttaaresult-muuttujan tietotyypininttietotyypiksistring.Päivitä koodi Visual Studio Code Editorissa seuraavasti:
int first = 2; string second = "4"; string result = first + second; Console.WriteLine(result);Tallenna kooditiedosto ja suorita sitten koodisi Visual Studio Coden avulla.
Huomaa seuraava tuloste:
24Tulos on matemaattisesti virheellinen, mutta se valmistuu yhdistämällä arvot merkeiksi "2" ja "4".
Tutki jälleen kerran ensimmäistä koodiesimerkkiä, jossa
result-muuttujan tyyppi onint. Koodi, jossa on virhesanoma.int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);Miksi C#-kääntäjä ei voi selvittää, että haluat käsitellä muuttujaa
second, joka sisältää4lukuna, eistring?
Kääntäjät tekevät turvallisia muunnoksia
C#-kääntäjä näkee mahdollisen ongelman tekemisessä. Muuttujan second tyyppi on string, joten se voidaan määrittää eri arvoon, kuten "hello". Jos C#-kääntäjä yritti muuntaa "hello" luvuksi, joka aiheuttaisi poikkeuksen suorituksen aikana. Tämän mahdollisuuden välttämiseksi C#-kääntäjä ei suorita implisiittisesti muunnosta stringint puolestasi.
C#-kääntäjän näkökulmasta turvallisempi toiminto olisi muuntaa intstring ja suorittaa sen sijaan ketjutus.
Jos aiot tehdä yhteenlaskun merkkijonon avulla, C#-kääntäjä edellyttää, että hallitset tietojen muuntamisprosessia tarkemmin. Toisin sanoen se pakottaa sinut osallistumaan enemmän, jotta voit ottaa käyttöön asianmukaiset varotoimenpiteet, jotta muunnoksen mahdollisuus voi aiheuttaa poikkeuksen.
Jos haluat muuttaa arvon alkuperäisestä tietotyypistä uudeksi tietotyypiksi ja muutos voi aiheuttaa poikkeuksen suorittamisen aikana, sinun on suoritettava tietojen muuntaminen.
Tietojen muunnoksen suorittamiseen voit käyttää jotakin seuraavista tekniikoista:
- Apumenetelmän käyttö tietotyypissä
- Apumenetelmän käyttö muuttujassa
-
Convertluokan" menetelmien käyttäminen
Tutustu muutamaan esimerkkiin näistä tietojen muuntamistekniikoista myöhemmin tässä yksikössä.
Kysymys: Onko mahdollista, että arvon tietotyypin muuttaminen johtaa tietojen menettämiseen?
Poista rivin kommenttioperaattori
//lisätäksesi kommentin edellisessä harjoitusvaiheessa olevaa koodia varten ja lisätäksesi seuraavan koodin:int myInt = 3; Console.WriteLine($"int: {myInt}"); decimal myDecimal = myInt; Console.WriteLine($"decimal: {myDecimal}");Tallenna kooditiedosto ja suorita sitten koodisi Visual Studio Coden avulla.
Sinun pitäisi nähdä seuraava tuloste:
int: 3 decimal: 3Tässä esimerkissä avain on seuraava koodirivi:
decimal myDecimal = myInt;Koska mikä tahansa
intarvo mahtuu helpostidecimalsisälle, kääntäjä suorittaa muunnoksen.Termi muunnoksen laajentaminen tarkoittaa sitä, että yrität muuntaa arvon tietotyypistä, joka voisi sisältää vähemmän tietojasellaisen tietotyypin, joka voisi sisältää enemmän tietoja. Tässä tapauksessa muuttujatyyppiseen muuttujaan tallennettu arvo
intmuunnetaan muuttujatyypiksi, jonka tyyppi ondecimal, ei menetä tietoja.Kun tiedät suorittavasi levennysmuunnosta, voit luottaa implisiittisen muunnoksen . Kääntäjä käsittelee implisiittiset muunnokset.
Suorita näyttelijän rooli
Poista rivin kommenttioperaattori
//lisätäksesi kommentin edellisessä harjoitusvaiheessa olevaa koodia varten ja lisätäksesi seuraavan koodin:decimal myDecimal = 3.14m; Console.WriteLine($"decimal: {myDecimal}"); int myInt = (int)myDecimal; Console.WriteLine($"int: {myInt}");Jos haluat suorittaa muunnon, käytä casting-operaattoria
()tietotyypin ympäröimiseksi ja sijoita se sitten muunnettavan muuttujan viereen (esimerkki:(int)myDecimal). Suoritat eksplisiittisen muunnoksen määritettyyn tyyppimuunnostietotyyppiin (int).Tallenna kooditiedosto ja suorita sitten koodisi Visual Studio Coden avulla.
Sinun pitäisi nähdä seuraava tuloste:
decimal: 3.14 int: 3Tässä esimerkissä avain on seuraava koodirivi:
int myInt = (int)myDecimal;Muuttuja
myDecimalsisältää arvon, jolla on tarkkuus desimaalipisteen jälkeen. Kun lisäät casting-ohjeen(int), kerrot C#-kääntäjälle, että ymmärrät, että on mahdollista menettää tuo tarkkuus, ja tässä tilanteessa se ei haittaa. Yrität kertoa kääntäjälle, että olet suorittamassa tarkoituksellista muunnosta, joka on eksplisiittinen muunto.
Selvitä, onko muunto "levennysmuunnos" vai "kavennusmuunnos".
Termi muuntamista kaventava tarkoittaa sitä, että yrität muuntaa arvon tietotyypistä, joka voi sisältää enemmän tietoja tietotyypiksi, joka voi sisältää vähemmän tietoja. Tässä tapauksessa voit menettää tietoja, kuten tarkkuuden (eli desimaalipilkun jälkeen olevien arvojen määrän). Esimerkki on -muuttujan decimal tallennetun arvon muuntaminen muuttujaksi, jonka tyyppi on int. Jos tulostat kaksi arvoa, huomaat mahdollisesti tietojen menettämisen.
Kun tiedät suorittavasi kavennusmuunnosta, sinun on suoritettava muunnos. Roolitus on ohje C#-kääntäjälle, jonka tiedät tarkkuuden olevan menetettävä, mutta olet valmis hyväksymään sen.
Jos et ole varma, menetätkö tietoja muunnoksen yhteydessä, kirjoita koodi, jos haluat suorittaa muunnoksen kahdella eri tavalla, ja noudata muutoksia. Kehittäjät kirjoittavat usein pieniä testejä käyttäytymisen ymmärtämiseksi paremmin, kuten seuraavassa esimerkissä kuvataan.
Poista rivin kommenttioperaattori
//lisätäksesi kommentin edellisessä harjoitusvaiheessa olevaa koodia varten ja lisätäksesi seuraavan koodin:decimal myDecimal = 1.23456789m; float myFloat = (float)myDecimal; Console.WriteLine($"Decimal: {myDecimal}"); Console.WriteLine($"Float : {myFloat}");Tallenna kooditiedosto ja suorita sitten koodisi Visual Studio Coden avulla.
Tulosteen pitäisi olla seuraavan kaltainen:
Decimal: 1.23456789 Float : 1.2345679Voit huomata, että
decimalheittäminenfloaton kaventavan muunto, koska menetät tarkkuutta.
Tietomuunnosten suorittaminen
Aiemmin todettiin, että arvon muutos yhdestä tietotyypistä toiseen voi aiheuttaa suorituksenaikaisen poikkeuksen, ja sinun on suoritettava tietojen muuntaminen. Tietojen muuntamiseen on käytettävissä kolme tekniikkaa:
- Apumenetelmän käyttö muuttujassa
- Apumenetelmän käyttö tietotyypissä
-
Convertluokan" menetelmien käyttäminen
ToString() avulla voit muuntaa luvun string
Jokaisella tietotyyppimuuttujalla on ToString()-menetelmä.
ToString()-menetelmän toiminta määräytyy sen mukaan, miten se otetaan käyttöön tietyssä tyypissä. Useimmissa primitiiveissä se kuitenkin suorittaa laajenevan muunnoksen. Tämä ei ole tiukasti tarpeen (koska useimmissa tapauksissa voit luottaa implisiittiseen muuntamiseen), mutta se voi viestiä muille kehittäjille, että ymmärrät, mitä teet ja mikä on tarkoituksellista.
Seuraavassa on lyhyt esimerkki ToString()-menetelmän käyttämisestä int-arvojen eksplisiittiseen muuntamiseen string.
Poista rivin kommenttioperaattori
//lisätäksesi kommentin edellisessä harjoitusvaiheessa olevaa koodia varten ja lisätäksesi seuraavan koodin:int first = 5; int second = 7; string message = first.ToString() + second.ToString(); Console.WriteLine(message);Tallenna kooditiedosto ja suorita sitten koodisi Visual Studio Coden avulla. Kun suoritat koodin, tulosteen pitäisi näyttää kahden arvon ketjutus:
57
string muuntaminen intParse() -apumenetelmällä
Useimmissa numeerisissa tietotyypeissä on Parse() -menetelmä, joka muuntaa merkkijonon annetuksi tietotyypiksi. Tässä tapauksessa käytät Parse() -menetelmää kahden merkkijonon muuntamiseen int arvoiksi ja niiden yhdistämiseksi.
Poista rivin kommenttioperaattori
//lisätäksesi kommentin edellisessä harjoitusvaiheessa olevaa koodia varten ja lisätäksesi seuraavan koodin:string first = "5"; string second = "7"; int sum = int.Parse(first) + int.Parse(second); Console.WriteLine(sum);Tallenna kooditiedosto ja suorita sitten koodisi Visual Studio Coden avulla. Kun suoritat koodin, tulosteen pitäisi näyttää kahden arvon summa:
12Yritä löytää mahdollinen ongelma edellisen koodiesimerkin avulla. Entä jos jompikumpi
first- taisecond-muuttujista on määritetty arvoihin, joita ei voi muuntaaint? Suorituksen aikana tapahtuu poikkeus. C#-kääntäjä ja suorituspalvelu odottaa, että suunnittelet etukäteen ja estät "laittomat" muunnokset. Voit lieventää suorituksenaikaista poikkeusta useilla tavoilla.Helpoin tapa lieventää tätä tilannetta on käyttää
TryParse(), joka onParse()menetelmän parempi versio.
string muuntaminen intConvert-luokan avulla
Convert luokassa on useita apumenetelmiä arvon muuntamiseksi yhdestä tyypistä toiseen. Seuraavassa koodiesimerkissä muunnat pari merkkijonoa arvoiksi, jotka tyyppiä int.
Poista rivin kommenttioperaattori
//lisätäksesi kommentin edellisessä harjoitusvaiheessa olevaa koodia varten ja lisätäksesi seuraavan koodin:string value1 = "5"; string value2 = "7"; int result = Convert.ToInt32(value1) * Convert.ToInt32(value2); Console.WriteLine(result);Tallenna kooditiedosto ja suorita sitten koodisi Visual Studio Coden avulla.
Sinun pitäisi nähdä seuraava tuloste:
35Muistiinpano
Miksi menetelmän nimi on
ToInt32()? Miksi eiToInt()?System.Int32on sen .NET-luokkakirjaston pohjana olevan tietotyypin nimi, jonka C#-ohjelmointikieli yhdistää avainsanaanint. KoskaConvertluokka on myös osa .NET-luokan kirjastoa, sitä kutsutaan sen koko nimellä, ei sen C#-nimellä. Kun määrität tietotyypit .NET-luokkakirjaston osana, useat .NET-kielet, kuten Visual Basic, F#, IronPython ja muut, voivat jakaa samoja tietotyyppejä ja samoja luokkia .NET-luokan kirjastossa.ToInt32()-menetelmässä on 19 ylikuormitettua versiota, joiden avulla se voi hyväksyä lähes kaikki tietotyypit.käytit
Convert.ToInt32()tässä merkkijonossa, mutta sinun tulisi todennäköisesti käyttääTryParse(), kun se on mahdollista.Milloin siis kannattaa käyttää
Convert-luokkaa?Convertluokka sopii parhaiten murtolukujen muuntamiseen kokonaisluvuiksi (int), koska se pyöristää odottamallasi tavalla.
Vertaa valua ja decimal muuntamista int
Seuraavassa esimerkissä näytetään, mitä tapahtuu, kun yrität muuntaa decimalint (kaventava muunto) sen jälkeen, kun Convert.ToInt32()-menetelmää käytetään saman decimal muuntamiseen int.
Poista rivin kommenttioperaattori
//lisätäksesi kommentin edellisessä harjoitusvaiheessa olevaa koodia varten ja lisätäksesi seuraavan koodin:int value = (int)1.5m; // casting truncates Console.WriteLine(value); int value2 = Convert.ToInt32(1.5m); // converting rounds up Console.WriteLine(value2);Tallenna kooditiedosto ja suorita sitten koodisi Visual Studio Coden avulla.
Sinun pitäisi nähdä seuraava tuloste:
1 2
Valamisen katkaisukat ja pyöristyspyörittojen muuntaminen
Kun valutat int value = (int)1.5m;, liukuluvun arvo katkaistaan niin, että tulos on 1, mikä tarkoittaa, että desimaalin jälkeinen arvo ohitetaan kokonaan. Voit muuttaa literaalin liukulukua 1.999m ja valun tulos olisi sama.
Kun muunnat käyttäen Convert.ToInt32(), literaalilukuarvo pyöristetään oikein ylöspäin 2. Jos muutat literaaliarvon arvoksi 1.499m, se pyöristetään alaspäin muotoon 1.
Kertaus
Käsittelit useita tärkeitä tietojen muuntamiseen ja valuun liittyviä käsitteitä:
- Suorituksenaikaisen virheen estäminen tietojen muunnosta suoritettaessa
- Eksplisiittinen näyttelijä kertoo kääntäjälle, että ymmärrät tietojen menettämisen riskin
- Luota kääntäjään implisiittisen muunnoksen suorittamisessa, kun suoritat laajenevaa muunnosta
- Käytä
()cast-operaattoria ja tietotyyppiä näyttelijäkaartin suorittamiseen (esimerkiksi(int)myDecimal) - Käytä
Convertluokkaa, kun haluat kaventaa konversiota, mutta haluat suorittaa pyöristyksen, et tietojen katkaisua.