Peruskäsitteitä: Kastaus ja tyyppimuunnokset (cast oveloading)

Kastaus ja tyyppimuunnokset

Koska C# on staattisesti tyypitetty käännösaikana, niin sen jälkeen kun muuttuja on määritelty, sitä ei voi uudelleen määrittää, tai siihen ei voi asettaa toisen tyyppistä arvoa, joka ei ole muunnettavissa muuttujan (olion) tyyppiin. Esimerkiksi seuraava koodinpätkä aiheuttaisi virheen:


    

Tyyppimuunnos (käytetään myös termiä kastaus, englanninkielisestä sanasta 'casting') on muuttujatyypin muuntamista joko käännös- tai ajonaikana tyypistä toiseen. Koska C#:ssa kaikki muuttujat ovat olioita, on siis kyseessä olion muuntaminen toiseksi olioksi.

Tyyppimuunnokset voidaan tehdä joko eksplisiittisesti tai implisiittisesti:

ImplisiittinenMuunnos tapahtuu kääntäjän toimesta eikä sen tekemistä varten koodissa ole erityistä komentoa. Implisiittisesta muunnoksesta ei koskaan voi tulla virhettä.
EksplisiittinenMuunnosta eli kastausta (casting) ei koskaan tehdä kääntäjän toimesta, vaan koodiin on kirjoitettu muunnosta varten erityinen komento. Eksplisiittinen muunnos voi aiheuttaa ajonaikaisen virheen, joten siihen täytyy koodissa varautua sopivalla poikkeuskäsittelyllä.

Kanta- ja perityn luokan tyyppimuunnokset

Olio voidaan:
- implisiittisesti kastata perityn luokan oliosta kantaluokan olioksi (upcast)
- kastata explisiittisesti kantaluokan oliosta perityn luokan olioksi (downcast)
Tämä on helppo muistaa sen avulla että peritty luokkaa laajentaa ja/tai muuttaa kantaluokkaa, ja siinä mielessä 'enemmän' kuin kantaluokka. Peritty luokka siis sisältää kaiken mitä kantaluokka, ja mahdollisesti jopa enemmän. Joten muutos peristystä luokasta kantaluokkaan on mahdollinen ilman pelkoa tiedon menettämisestä. Toistepäin muutettaesa taas täytyy varmistaa että muunnoksessa oliolle 'luodaan' tarvittavat tiedot, joita ei ehkä kantaluokassa ole.

Allaoleva kuva esittää miten peritty luokan olio voidaan kastata implisiittisesti kantaluokan olioksi, sillä peritty luokka sisältä aina vähintään kaiken mitä kantaluokkakin. Toistepäin kastaaminen täytyy tehdä eksplisiittesti, koska perityn luokan olio voi sisältää enemmän kuin kantaluokan olio.

Implisiittinen kastaus omilla olioilla

Alla olevassa esimerkissä on käytetty kahta luokkaa: Animal ja Rat. Rat on peritty kantaluokasta Animal. Suoritetaan oheisen koodin mukainen implisiittinen kastaus.


	

Lukujen muuntaminen

Implisiittinen kastaus

Koska int (32-bittiä) on lukualueena pienempi kuin long (64-bittinen), niin int-tyypin muuttuja voidaan "turvallisesti" implisiittisesti kastata long-tyyppiin.


    
    

Eksplisiittinen kastaus

Koska double on lukualueena suurempi kuin int, niin ei turvallista eikä viisasta muuttaa double-tyypin muuttujaa int-tyyppiseksi, joten kääntäjä ei salli tätä tehdä. Suuremmasta lukualueesta pienempään lukualueeseen muutettaessa voi tapahtua tiedon häviämistä, joten muutokset täytyy tehdä eksplisiittisesti, jos tiedät, että tiedon häviäminen ei aiheuta vaikutuksia ohjelmaasi.


	

Toinen vaihtoehto on käyttää .NET Frameworkin tarjoamaa metodia Convert.


	
    

Lisää esimerkkejä kastauksesta


	

Merkkijonojen muuttaminen luvuiksi Parse ja TryParse-metodeilla

C# tarjoaa myös valmiita mekanismeja merkkijonojen parseroimiseksi. TryParse() ja Parse() metodit tarjoavat helpotusta merkkijonojen muuntamiseksi luvuiksi.



	

Olion tyypin selvittäminen, testaaminen ja muuttaminen

Tyypin selvittäminen GetType-metodilla

Jos haluat saada selville mistä luokasta olio on luotu, saat sen selville GetType()-metodilla


    

as-operaattori

Viittaustyypin eksplisiittinen muutos voidaan tehdä as-operaattorilla. Se tekee muunnoksen mikäli mahdollista. Ellei muunnos ole mahdollinen, palautuu null-arvo. As-operaattoria voi käyttää vain viittaustyypeille, koska arvotyypeillä ei ole null-arvoa. As-operaattorin etu on siinä, että muutoksesta ei tule poikkeusta.

is-operaattori

is-operaattorilla voidaan testata onko muuttuja tiettyä tyyppiä (tai toteuttaako se tietyn rajapinnan).Se palauttaa true tai false. Sitä käytetään lähinnä tarkistuksissa, koska sillä ei voi tehdä itse muutoksia.

Lisätietoa:

Casting and type conversions (C# Programming Guide)