În programare, valori de multe ori de variabile de același tip sunt atribuite unei variabile de alt tip. De exemplu, în următorul fragment int tip valoarea de cod întreg este atribuit un punct plutitor tip float:
În cazul în care o operațiune de atribuire mix tipuri de date compatibile, valoarea pe partea dreaptă a operatorului de atribuire este convertit automat la tipul specificat în partea stângă. Prin urmare, în fragmentul de cod de mai sus, valoarea variabilei i este transformată mai întâi în tip float, apoi atribuită f variabilă. Dar, din cauza dactilografiere puternic nu este toate tipurile de date în C # sunt pe deplin compatibile, și, prin urmare, nu toate conversiile de tip sunt permise implicit. De exemplu, tipul bool și int incompatibile. Cu toate acestea, conversia tipurilor incompatibile poate fi efectuată în continuare prin turnare. Mulaje, substanțial mijloace clare de transformare.
Tipul de conversie automată
În cazul în care același tip de date sunt atribuite unui alt tip de o variabilă, o conversie de tip implicită apare în mod automat în următoarele condiții:
- ambele tipuri sunt compatibile
- o serie de reprezentare numărul de tipul țintă este mai mare decât tipul de original
În cazul în care aceste două condiții sunt îndeplinite, atunci există o conversie tot mai mare. De exemplu, int, suficient de mare pentru a se potrivi toate valorile valide de tip octet, și, în plus, ambele tipuri, int, și octet, tipuri întregi sunt compatibile, astfel încât pentru ei este posibilă conversie implicită.
Tipuri numerice, atât întreg și virgulă mobilă complet compatibile între ele pentru a efectua raspandirea transformatele. Luați în considerare acest exemplu:
Rețineți că metoda Suma () se așteaptă ca doi parametri de primire de tip int. Cu toate acestea, în metoda principală () a trecut de fapt două variabile de tip scurt. În timp ce acest lucru poate părea o nepotrivire de tip, programul va compila și rula fără eroare și să se întoarcă rezultatul, cum era de așteptat, valoarea de 25.
Motivul pentru care compilatorul va lua acest cod este corect sintactic, datorită faptului că pierderea de date este posibilă. Deoarece valoarea maximă (32767), care poate cuprinde un tip scurt, bine în intervalul de tip interval int (care este valoarea maximă a 2147483647), compilatorul va extinde implicit fiecare variabilă de tip scurt la tipul int. Punct de vedere tehnic, termenul „expansiune“ este utilizat pentru a indica acționarea implicită pe legătură în sus (exprimate în sus), care nu duce la pierderea datelor.
Aducerea tipuri incompatibile
În ciuda utilitatea conversii de tip implicite, acestea sunt în imposibilitatea de a satisface toate nevoile în programare, deoarece permite doar lărgirea conversii tipuri compatibile. Dar, în toate celelalte cazuri, este necesar să se aplice exprimate. Aducerea - o comandă compilator pentru a converti rezultatul expresiei tipului specificat. Dar acest lucru necesită un tip de conversii explicite. Mai jos este o formă generală de o distributie:
Aici tselevoy_tip denotă tipul la care este de dorit să se convertească expresia specificată.
Dacă turnare duce la o conversie îngustarea. o parte din informațiile pot fi pierdute. De exemplu, de conducere de tip long int la tipul de informații se pierde în cazul în care valoarea de tip lung este mai mare decât cifrele reprezintă intervalul de tipul int, deoarece biți cele mai semnificative ale valorilor numerice aruncate. Atunci când valoarea în virgulă mobilă convertit la un întreg, rezultatul este pierdut trunchierea partea fracționară a valorii numerice. Astfel, în cazul în care valoarea atribuită variabilei 1,23 întreg, rezultatul va fi doar partea întreagă a sursei (1), iar partea fracționară (0,23) vor fi pierdute. Să ne uităm la un exemplu:
Rezultatul acestui program va fi:
Rețineți că I1 variabilă corect convertită în tipul scurt, deoarece valoarea sa este în intervalul de tipul de date. Conversia variabilă dec într-un int returnat partea întreagă a acestui număr. Conversia I2 variabilă a revenit valoarea revărsare 18964 (de exemplu, 84500 - 32768 * 2).
Interceptarea îngustarea transformări de date
In exemplul anterior, acționarea i2 variabilă de tip scurt nu este acceptabil, deoarece există pierderi de date. Pentru a crea aplicații în care pierderea de date este de a fi inadmisibilă, în C # includ cuvinte cheie, cum ar fi verificate și neverificate. pentru a asigura faptul că pierderea de date nu va fi neobservat.
În mod implicit, atunci când nu este de a lua orice măsuri corective corespunzătoare, o condiție de depășire (depășire) și underflow (underflow) are loc fără erori. Condiții de prelucrare preaplin și subîncărcare în aplicația în două moduri. Acest lucru se poate face manual, bazându-se pe cunoștințele lor de programare și abilități.
Dezavantajul acestei abordări este că, chiar dacă cel mai bun efort omul este încă un om, iar unele erori pot aluneca departe de ochii lui.
Din fericire, C # oferă cuvântul cheie verificat. În cazul în care operatorul (sau operatorii de bloc), se face în contextul verificat, C # compilator generează instrucțiuni CIL-suplimentare, oferind un control pentru condiții de preaplin care pot apărea ca urmare a adăugării, multiplicare, scădere, sau diviziune a două tipuri de date numerice.
În cazul unei condiție de depășire la rulare va arunca o System.OverflowException excepție. Să ne uităm la un exemplu în cazul în care vom transfera la consola cu excepția valorii:
Rezultatul acestui program:
Configurarea verificări pentru apariția condițiilor de preaplin în domeniul de aplicare al proiectului
Dacă creați o aplicație în care preaplinul nu ar trebui să treacă neobservate, s-ar putea constata că flancul conturile verificate de cuvinte cheie supărător multe linii de cod. Într-un asemenea caz, ca o alternativă la compilator C # sprijină pavilion / verificat. Când este activat pentru o posibilă pavilion de verificare overflow va aplica în mod automat toate operațiile aritmetice de cod existente, fără utilizarea de fiecare dintre aceste cuvinte cheie verificate. Overflow Detectarea același mod conduce la generarea excepției corespunzătoare în timpul rulării.
Este important de remarcat faptul că în C # oferă cuvântul cheie nebifată. care vă permite să dezactivați emiterea asociată cu excepțiile supraaglomerare în cazuri individuale.
Deci, pentru a rezuma pentru utilizare în C # cuvinte cheie verificate și neverificate, trebuie remarcat faptul că preaplinul implicit aritmetică în runtime .NET ignorat. Dacă doriți să trateze operatorii individuali, trebuie utilizat cuvinte cheie verificat numai, dar dacă doriți pentru a prinde toate erorile asociate cu preaplin în cerere, va trebui să activați steagul / verificat. În ceea ce privește cuvântul cheie Neinregistrate, acesta poate fi utilizat în prezența unui bloc de cod, în care overflow este permisă (și, prin urmare, nu ar trebui să determine o excepție în timpul rulării).
Rolul System.Convert de clasă
La sfârșitul conversie temă tip de date este de remarcat faptul că, în spațiul de nume de sistem de clasă Conversie disponibile. care pot fi de asemenea utilizate pentru extinderea și contracția datelor:
Un avantaj al folosirii clasei System.Convert abordare datorită faptului că permite să efectueze conversii între tipuri de date în mod neutru limba (de exemplu, o distribuție în sintaxa Visual Basic este complet diferit de propuse pentru acest scop, în C #). Cu toate acestea, din moment ce C # au clasă explicită operațiune de conversie pentru utilizare Conversia tip de date de conversie este de obicei o chestiune de gust. )