Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Conversia datelor in .Net

     Inainte de a continua prezentarea tipurilor de date din C#, voi introduce un capitol care se leaga strans de tipurile valorice numerice si anume conversiile.

Deocamda, cunoastem structura tipurilor de date astfel :

structura Partiala Tip Date

    Definim expresie in modul urmator :

     O expresie este o combinatie valida de operatori, literali si variabile.

     O conversie permite ca o expresie de un anumit tip, sa fie tratata ca o expresie de un alt tip.

Exista doua tipuri de conversii numerice :

Conversii implicite

Conversii Implicite

    Conversia implicita se efectueaza automat doar daca nu este afectata valoarea convertita ( tipul destinatie este mai cuprinzator decat tipul sursa ) si cele doua tipuri sunt compatibile. Daca sunt indeplinite cele doua conditii, atunci valoarea din partea din dreapta este convertita la tipul din partea stanga.

int i;
float f;

i = 10;

//atribuim unui int unui float 
//valoarea lui i este intai convertita la tipul float 
//apoi atribuita lui f 
f = i;

Tipul float este suficient de cuprinzator pentru a memora orice valoare de tip int(conversie prin largire ).

     Chiar daca se poate efectua conversia automata din int in float, invers nu se poate efectua automat.

int i;
float f;

f = 30.4F;
i = 10;

//conversia automata nu are loc
i = f;

Eroare la compilare: “Cannot implicitly convert type ‘float’ to ‘int’. An explicit conversion exists (are you missing a cast?)

Conversii explicite

Conversii Explicite

    Pentru a rezolva eroare de mai sus, este nevoie de folosirea unui cast (o directiva catre compilator pentru convertirea unui tip in altul).

(tip-tinta) expr;

tip – tinta – tipul la care dorim sa convertim expresia expr;

int i;
float f;

f = 30.4F;
Console.WriteLine("Valoarea inainte de conversie {0} ", f);
//conversie cu trunchiere          

i = (int)f;
Console.WriteLine("Valoarea dupa conversia de la float la int este {0} ", i); 

    Se observa ca partea fractionara se pierde, atunci cand valoarea in virgula mobila este convertita la un tip intreg ( conversie prin restrangere ).

char ch;
byte b;
//codul ASCII pentru X 
b = 88;
//cast intre tipuri incompatibile 
ch = (char)b;
Console.WriteLine("ch : " + ch); 

    Una din cele mai intalnite conversii in programare este cea din tipul numeric in sir de caractere. Aceasta se realizeaza cu metoda ToString din clasa Object.

int a = 2009; string s = a.ToString(); Console.WriteLine("{0} este {1}", a, a.GetType()); Console.WriteLine("{0} este {1}",s, s.GetType());

    La fel de folosita este si conversia din caractere in numar, care se realizeaza cu metoda Parse din clasa Object.

Daca sirul de caractere nu reprezinta un numar valid, conversia sirului la numar va esua.

int a = 2009;

string s = a.ToString();
           
Console.WriteLine("{0} este  {1}", a, a.GetType());
Console.WriteLine("{0} este {1}",s, s.GetType());

Conversiile boxing si unboxing

   Boxing (“impachetare”) permite ca tipurile valoare sa fie tratate ca obiecte. Boxing este o conversie implicita. “Impachetarea” unei valori a unui tip valoare se realizeaza prin alocarea unui obiect si copierea valorii in obiectul nou creat.

   Rezultatul va fi crearea unui obiect 0, pe stiva,care va fi referinta catre o valoare de tip int, pe stiva. Valoarea este o copie a valorii asignate variabilei a.

boxed
//declararea si initializarea unui tip valoare
int a = 2009;
//boxing asupra variabilei de tip valoare
object o = a;
            
//schimba valoarea
a = 2010;

Console.WriteLine("Valoarea tipului valoric este {0}", a);
Console.WriteLine("Valoarea tipului obiect este {0}", o);

   “Unboxing” permite o conversie explicita de la tipul obiect la orice alta valoare de tip valoare. O operatie de unboxing consta in verificarea faptului ca obiectul instantiaza o valoare “boxed” a unui tip vlaoare, apoi copiaza valoare catre instanta.

unboxing

int a = 2009;

//boxing

object o = a;

int j = 0;
//unboxing
j = (int)o;

//schimb valoarea pentru tipul valoare
a = 2010;
Console.WriteLine("Valoarea tipului valoric este {0}", a);
Console.WriteLine("Valoarea tipului obiect este {0}", o);
Console.WriteLine("Valoarea noului tip valoric, dupa unboxing este {0}", j);

O alta conversie pe care vreau sa o mentionez este cea din Enum in int si invers.
Daca avem enumeratia prezentata in exemplul din postarea anterioara, Tipuri de date in limbajul c# – tipuri valorice, ZileSaptamana putem scrie:
int luni = (int)tipulEnum.ZileSaptamana.Luni; //luni va fi egal cu 1

sau putem scrie:
tipulEnum.ZileSaptamana luni = (tipulEnum.ZileSaptamana)1;

Category: Uncategorized
  • pan says:

    Tot pentru conversii mai poti folosi clasa static System.Convert; de asemenea, de mare ajuto este functia [type].TryParse(…) in cazul in care vrei sa faci conversie tratand automat si eventualele erori de conversie

    January 8, 2010 at 8:33 pm
  • zeltera says:

    Nu pot scrie despre tot intr-un singur post! Si in plus, mai trebuie sa scriu si maine despre ceva!

    January 9, 2010 at 12:08 am
  • Pingback/Trackback

    Nullable | by zeltera

Your email address will not be published. Required fields are marked *

*