Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Lloji i nënkuptuar i hedhjes në c #. Konvertimi automatik i tipit

Konvertimi implicit i tipit të të dhënave kryhet nga përpiluesi C ++, ndërsa konvertimi i tipit të të dhënave eksplicite kryhet nga vetë programuesi. Për konvertimin e tipit të të dhënave unë do të them sa vijon: "Rezultati i çdo llogaritjeje do të konvertohet në llojin më të saktë të të dhënave të atyre llojeve të të dhënave që përfshihen në llogaritje." Për shembull ilustrues Unë do të paraqes një tabelë me konvertimet e llojeve të të dhënave. Le të shohim operacionin e ndarjes në tabelë. Si një lloj të dhënash numër të plotë, marrim ndër, Epo lloji real të dhënat që do të kemi noton.

Tabela 1 - Konvertimi i llojit të të dhënave eksplicite dhe implicite në C ++
x y Rezultati i ndarjes Shembull
divident ndarës private x = 15 y = 2
ndër ndër ndër 15/2=7
ndër noton noton 15/2=7.5
noton ndër noton 15/2=7.5

Tabela tregon se duke ndryshuar variablat në vende të ndryshme, rezultati mbetet i njëjtë (në rastin tonë, ky është dividenti dhe pjesëtuesi). Gjithçka ka të bëjë me konvertimin e nënkuptuar të llojit të të dhënave. Sa i përket konvertimit të qartë, është e nevojshme për të kryer disa manipulime, duke ndryshuar kështu rezultatin e llogaritjes. Mënyra më e lehtë për të konvertuar në mënyrë të qartë llojet e të dhënave, për shembull: le të themi se duhet të ndajmë numra të tillë 15 dhe 2, ne ndajmë! 15/2 = 7. Rezultati është i njëjtë si në tabelë. Por nëse bëni transformime të vogla, për shembull: 15.0 / 2 = 7.5 me këtë ndarje, numri 15 është real, atëherë rezultati do të jetë real. Vetë numri 15 nuk ka ndryshuar nga pikëpamja e matematikës, sepse 15 = 15.0. E njëjta teknikë mund të zbatohej për dy, rezultati do të ishte i njëjtë, por mund të zbatohej për dy numra në të njëjtën kohë, por pse, nëse një nga të dy mjafton.

Një mënyrë tjetër për të kthyer në mënyrë të qartë llojet e të dhënave:

Float (15) / 2 // rezultati është 7.5, numri 15 konvertohet në llojin real të të dhënave float. dyfish (15) / 2 // rezultati është 7.5 - i njëjti !!!

C ++ gjithashtu ofron operacion unar tip cast:

Static_cast(/ * ndryshore ose numri * /)

shembull: static_cast (15) / 2 rezultati është 7.5
Shembull me një ndryshore:

Int ret = 15; static_cast (ret) / 2 // rezultati është 7.5

Në rastin e një ndryshoreje, duhet të kuptoni se në rreshtin 2, ndryshorja ret nuk konvertohet në llojin e të dhënave float, por krijohet vetëm një kopje e përkohshme e ndryshores ret me llojin e të dhënave float. Le të shqyrtojmë në praktikë të gjitha metodat e eksplicite dhe konvertim i nënkuptuar llojet e të dhënave.

// pryeobrazovanie.cpp: Përcakton pikën hyrëse për aplikacionin e konsolës. #include "stdafx.h" #include #përfshi duke përdorur hapësirën e emrave std; int _tmain (int argc, _TCHAR * argv) (int int_value15 = 15, int_value2 = 2; // deklaro dy variablat si int float float_value15 = 15, float_value2 = 2; // deklaroni dy variabla noton cout<< fixed << setprecision(2) // определяем, при выводе чисел с плавающей точкой, два знака после запятой << "15 / 2 = " << int_value15 / int_value2 << endl //неявное преобразование типов данных << "15 / 2 = " << int_value15 / float_value2 << endl //неявное преобразование типов данных << "15 / 2 = " << float_value15 / int_value2 << endl //неявное преобразование типов данных << "15 / 2 = " << float_value15 / float_value2 << endl; //неявное преобразование типов данных cout << "15.0 / 2 = " << 15.0 / 2 << endl // явное преобразование типа данных, число 15.0 - число с плавающей точкой << "15 / 2.0 = " << 15 / 2.0 << endl; // явное преобразование типа данных, число 2.0 - число с плавающей точкой cout << "float(int_value15) / int_value2 = " << float(int_value15) / int_value2 << endl // явное преобразование типа данных << "15 / double(2) = " << 15 / double(2) << endl; // используя приводимый тип как функцию cout << "static_cast(15) / 2 = " << static_cast(15) / 2 << endl // унарная операция приведения типа << "static_cast(15) = " << static_cast(15) << endl // можно печатать различные символы из таблицы ASCII, << "static_cast(20) = " << static_cast(20) << endl; // в скобочках прописываем код символа, который находим в таблице ASCII system("pause"); return 0; }

V rreshti 5 lidhur , kjo bibliotekë nevojitet për të përdorur manipulues të ndryshëm, në rastin tonë - saktësi fikse e vendosjes (). V rreshti 10krijuar posaçërisht dy variabla si ndër , në mënyrë të ngjashme krijoi dy variabla të llojit notoj brenda rreshti 11, këto variabla do të nevojiten për të kthyer vlerat e tyre në lloje të tjera të dhënash. Vrreshti 12pas operatorit cout dhe zhvendosja e operacioneve në rrjedhën e daljes << ka dy manipulues fikse dhe me saktësi të caktuar (). Manipulator fiks - ky nuk është manipulues i parametrizuar, pasi nuk pranon asnjë parametër, shkruhet pa kllapa. Ky manipulues përdoret në lidhje me një manipulues të parametrizuar saktësia e vendosjes () dhe kryen një paraqitje fikse të numrave dhjetorë. Një manipulues saktësia e vendosjes () tregon numrin e numrave dhjetorë dhe atë që tregohet në kllapa. Vrreshtat 13, 14, 15, 16tregohen shembuj të konvertimit të nënkuptuar të tipit të të dhënave, këta shembuj janë marrë ngaTabela 1... V rreshtat 17, 18tregon një nga mënyrat për të transformuar në mënyrë eksplicite të dhënat. Thelbi i kësaj metode është që ju duhet të shtoni një presje dhe zero në një numër të plotë. Vrreshtat 19, 20Konvertimi eksplicit kryhet duke përdorur si funksione tipe të castable, brenda kllapave të të cilave, duhet të specifikoni vlerën ose variablin që do të konvertohet. Në rreshtat 21, 22, 23, kryhet një konvertim i qartë i llojit të të dhënave duke përdorur një operacion unar të konvertimit të të dhënave. Kllapat tregojnë variablin ose vlerën që do të konvertohet, dhe karakteret janë të kornizuara < > lloji i të dhënave në të cilin duhet të konvertohet. Një shembull se si funksionon programi është paraqitur më poshtë (shih Figurën 1).

Figura 1 - Konvertimi eksplicit dhe i nënkuptuar i llojeve të të dhënave C ++

V rreshtat 22, 23 kryhet një operacion unar i konvertimit të të dhënave dhe numrat 15 dhe 20 konvertohen në char. Ky lloj i të dhënave nuk është ende i njohur për ju, por mbani mend se char është lloji i të dhënave për ruajtje. Pra, nga Figura 1 ju mund të shihni se ka simbole në fund. Këto karaktere janë marrë duke konvertuar numrat në char. Numrat ishin kode nga. Kështu, nëse keni nevojë të shfaqni ndonjë karakter nga tabela ASCII, kjo mund të bëhet siç tregohet në rreshtat 22, 23, duke zëvendësuar vetëm kodin e kërkuar.

Përditësimi i fundit: 30.07.2018

Në kapitullin e mëparshëm, folëm për konvertimin e objekteve të llojeve të thjeshta. Tani le të prekim temën e konvertimit të objekteve të klasës. Le të themi se kemi hierarkinë e mëposhtme të klasës:

Personi i klasës (emri i vargut publik (merr; vendos;) publik Person (emri i vargut) (Emri = emri;) Ekrani publik i zbrazët () (Console.WriteLine ($ "Person (Emri)");)) klasa Punonjës: Personi ( string publik Kompania (merr; vendos;) publike Punonjësi (emri i vargut, kompania e vargut): baza (emri) (Kompania = kompania;)) klasa Klienti: Personi (Banka e vargut publik (merr; vendos;) publik Klienti (emri i vargut, banka e vargjeve): baza (emri) (Banka = bankë;))

Në këtë hierarki të klasës, ne mund të gjurmojmë zinxhirin e mëposhtëm të trashëgimisë: Objekti (të gjitha klasat trashëgojnë në mënyrë implicite nga lloji Object) -> Person -> Punonjës | Klient.

Për më tepër, në këtë hierarki të klasës, llojet e bazës janë në krye, dhe llojet e prejardhura janë në fund.

Transformimi në rrjedhën e sipërme. Upcasting

Objektet e një tipi të prejardhur (i cili është në fund të hierarkisë) përfaqësojnë gjithashtu llojin bazë. Për shembull, objekti Employee është gjithashtu një objekt i klasës Person. E cila, në parim, është e natyrshme, pasi çdo punonjës (Punonjës) është një person (Person). Dhe ne mund të shkruajmë, për shembull, si kjo:

Pavlefshmëri statike kryesore (args varg) (Punonjësi i punonjësit = Punonjës i ri ("Tom", "Microsoft"); Person person = punonjës; // konvertohet nga Punonjës në Konsolë Person.WriteLine (person.Name); Console.ReadKey (); )

Në këtë rast, ndryshores person, që përfaqëson llojin Person, i caktohet një referencë për objektin Employee. Megjithatë, për të ruajtur një referencë për një objekt të një klase në një variabël të një klase tjetër, duhet të kryeni një konvertim të tipit - në këtë rast, nga lloji Punonjës në llojin Person. Dhe meqenëse Punonjësi trashëgon nga klasa Person, kryhet automatikisht një konvertim i nënkuptuar lart - duke u konvertuar në llojet që janë në krye të hierarkisë së klasës, domethënë në klasën bazë.

Si rezultat, variablat punonjës dhe person do të tregojnë të njëjtin objekt në memorie, por vetëm pjesa që përfaqëson funksionalitetin e llojit Person do të jetë e disponueshme për variablin person.

Transformime të tjera në rrjedhën e sipërme bëhen në mënyrë të ngjashme:

Person person2 = Klient i ri ("Bob", "ContosoBank"); // konverto nga Klient në Person

Këtu, ndryshorja person2, e cila përfaqëson llojin Person, mban një referencë për objektin Klient, kështu që një konvertim i nënkuptuar nga poshtë-lart kryhet gjithashtu nga klasa e derivuar Client në llojin bazë Person.

Konvertimi i nënkuptuar lart do të ndodhë gjithashtu në rastin e mëposhtëm:

Personi i objektit1 = Punonjës i ri ("Tom", "Microsoft"); // Punonjësi për të kundërshtuar objektin person2 = Klient i ri ("Bob", "ContosoBank"); // nga Klienti tek objekti objekt person3 = Personi i ri ("Sam"); // Personi për të kundërshtuar

Meqenëse lloji i objektit është bazë për të gjitha llojet e tjera, konvertimi në të do të bëhet automatikisht.

Transformimet në rënie. Në rënie

Por përveç konvertimeve në rrjedhën e sipërme nga lloji i prejardhur në llojin bazë, ka zbritje ose ulje nga lloji bazë në llojin e prejardhur. Për shembull, në kodin e mëposhtëm, ndryshorja person ruan një referencë për objektin Employee:

Punonjësi i punonjësit = Punonjësi i ri ("Tom", "Microsoft"); Person person = punonjës; // konvertohet nga punonjës në person

Dhe mund të lind pyetja nëse është e mundur të qaseni në funksionalitetin e llojit Punonjës përmes një ndryshoreje të llojit Person. Por transformime të tilla nuk kalojnë automatikisht, sepse jo çdo person (Person object) është punonjës i ndërmarrjes (Objekt Punonjës). Dhe për një konvertim në rënie, duhet të aplikoni konvertime të qarta, duke treguar në kllapa llojin në të cilin dëshironi të konvertoheni:

Punonjësi i punonjësit = Punonjësi i ri ("Tom", "Microsoft"); Person person = punonjës; // konverto nga Punonjës në Person // Punonjës punonjës2 = person; // kjo nuk është e mundur, ju duhet një transformim i qartë Punonjës punonjës2 = (Punonjës) person; // konvertohet nga Personi në Punonjës

Le të shohim disa shembuj të transformimeve:

// Objekti Employee është gjithashtu i tipit objekt objekt obj = punonjës i ri ("Bill", "Microsoft"); // për të aksesuar aftësitë e tipit Employee, hidhni objektin në llojin Employee Employee emp = (Employee) obj; // objekti Klient është gjithashtu i tipit Person Person person = Klient i ri ("Sam", "ContosoBank"); // konverto nga Person në Klient Klient klient = (Klient) person;

Në rastin e parë, ndryshores obj i caktohet një referencë për objektin Employee, kështu që ne mund ta konvertojmë objektin obj në çdo lloj që ndodhet në hierarkinë e klasës midis objektit tip dhe Employee.

Nëse duhet t'i referohemi disa vetive ose metodave individuale të një objekti, atëherë nuk kemi nevojë t'i caktojmë objektin e transformuar një ndryshoreje:

// Objekti Employee është gjithashtu i tipit objekt objekt obj = punonjës i ri ("Bill", "Microsoft"); // cast Person për të thirrur Display ((Person) obj) .Display (); // ose kështu // ((Punonjësi) obj) .Shfaq (); // cast te Punonjësi për të marrë pronësinë e Kompanisë string comp = ((Punonjës) obj) .Kompania;

Në të njëjtën kohë, duhet pasur kujdes kur bëhen konvertime të tilla. Për shembull, çfarë ndodh në rastin e mëposhtëm:

// Objekti Employee është gjithashtu i tipit objekt objekt obj = punonjës i ri ("Bill", "Microsoft"); // cast tek Klienti për të marrë pronësinë e Bankës string bank = ((Klient) obj) .Banka;

Në këtë rast, do të marrim një gabim sepse ndryshorja obj mban një referencë për objektin Employee. Ky objekt është gjithashtu një objekt i llojeve objekt dhe Person, kështu që ne mund ta konvertojmë atë në këto lloje. Por ne nuk mund të konvertojmë në llojin e klientit.

Një shembull tjetër:

Punonjës emp = Personi i ri ("Tom"); //! Gabim Personi person = Personi i ri ("Bob"); Punonjës emp2 = (Punonjës) person; //! Gabim

Në këtë rast, ne po përpiqemi të konvertojmë një objekt të tipit Person në llojin Employee, dhe objekti Person nuk është një objekt Punonjës.

Ka një sërë mënyrash për të shmangur këto gabime të konvertimit.

Metodat e konvertimit

Së pari, mund të përdoret fjala kyçe as. Duke e përdorur atë, programi përpiqet të konvertojë shprehjen në një lloj specifik pa bërë përjashtim. Në rast të konvertimit të pasuksesshëm, shprehja do të përmbajë vlerën null:

Person person = Personi i ri ("Tom"); Punonjës emp = person si Punonjës; nëse (emp == null) (Console.WriteLine ("Konvertimi dështoi");) tjetër (Console.WriteLine (emp.Company);)

Mënyra e dytë është të kapni InvalidCastException që hidhet si rezultat i konvertimit:

Person person = Personi i ri ("Tom"); provo (Emp. Punonjës = (Punonjës) person; Console.WriteLine (emp.Company);) catch (InvalidCastException ex) (Console.WriteLine (p.sh. Message);)

Mënyra e tretë është të testoni vlefshmërinë e konvertimit duke përdorur fjalën kyçe:

Person person = Personi i ri ("Tom"); nëse (personi është Punonjës) (Punonjës emp = (Punonjës) person; Console.WriteLine (emp.Company);) other (Console.WriteLine ("Nuk lejohet konvertim");)

Shprehja e personit është Employee teston nëse ndryshorja person është një objekt i tipit Employee. Por meqenëse në këtë rast nuk është e qartë, atëherë një kontroll i tillë do të kthehet i rremë dhe konvertimi nuk do të funksionojë.

Në programim, shpesh lind nevoja për të kryer llogaritjet në variabla të një lloji, dhe si rezultat të merret një tjetër. Për shembull, kur ndani numra të plotë, merrni një real. Kur një vlerë e një lloji ruhet në një variabël të një lloji tjetër, kryhet një konvertim i tipit të të dhënave. Ka disa mekanizma për këtë në C #.

Konvertimi i nënkuptuar i llojit të të dhënave

Konvertimi i nënkuptuar ndodh kur një vlerë ruhet në një variabël të një lloji të ndryshëm pa e specifikuar atë në kod.

Që përpiluesi C # të konvertojë automatikisht llojin e të dhënave, duhet të plotësohen dy kushte:

  • Lloji i vlerës dhe lloji i ndryshores duhet të jenë në përputhje me njëri-tjetrin;
  • Gama e vlerave të mundshme të një lloji të ndryshueshme duhet të jetë jo më pak se ajo e një lloji të vlerës.

Byte a = 15; bajt b = 120; int c = a + b;

Ky shembull funksionon konvertim i nënkuptuar , dhe ndryshorja c do të jetë përfundimisht e tipit int. Kjo është e mundur sepse byte dhe int janë numra të plotë, dhe int përmban të gjithë gamën e bajtit.

Një shembull më shumë:

Shkurt a = 815; ushort b = a; // Gabim

Edhe pse 815 është në intervalin e shkurtër, në këtë rast do të shfaqet një mesazh gabimi... Kjo për faktin se përpiluesi për konvertimin e nënkuptuar kontrollon vetëm kushtet e mësipërme dhe shikon vetëm llojet, duke mos i kushtuar vëmendje vlerave specifike.

Konvertimi i qartë i llojit të të dhënave

Nëse kushtet e konvertimit të nënkuptuar nuk plotësohen, por duhet të kryhet konvertimi i tipit, përdoret derdhja e tipit. Ky është një tregues i llojit të synuar në të cilin do të konvertohet rezultati i llogaritjes, i shkruar në kllapa përpara shprehjes.

Int d = 13; int c = 4; var e = (dyfish) d / c;

Kështu, ndryshorja e do të marrë tipin e dyfishtë dhe vlerën 3.25. Nëse nuk do të përdornim konvertimin, atëherë kjo variabël do të kishte tipin int dhe vlerën 3 sipas rregullave për ndarjen e numrave të plotë në C #.

Një shembull tjetër:

Short num = 257; dyfishtë dbl = 34,9318; int rnd = (i shkurtër) dbl; // Do t'i caktohet vlera 34 byte what = (byte) num; // Do t'i caktohet vlera 1

Në rastin e rnd, plotësohet rregulli i mëposhtëm: gjatë konvertimit të numrave me pikë lundruese në numra të plotë, pjesa e tyre thyesore hidhet poshtë.

Dhe në rastin e çfarë gjithçka është pak më e ndërlikuar. Kur konvertohet në mënyrë eksplicite, përpiluesi injoron vargjet e tipit. Dhe gjatë ekzekutimit të programit, nëse tentohet të futet në një variabël një vlerë që nuk është në intervalin e saj (me një thellësi më të madhe të bitit), atëherë fshihen të gjitha bitet e rendit të lartë. Numri 257 në paraqitjen binar të tipit ushort duket si 00000001 00000001. Kur konvertohet në bajt, mbetet vetëm bajt i fundit 00000000, domethënë 1.

Konvertimi në të cilin diapazoni i llojit të ndryshores nuk mbulon plotësisht diapazonin e llojit të vlerës quhet ngushtim. Për të shmangur humbjen e të dhënave, si në shembullin e mëparshëm, duhet të përdorni një kontroll të tejmbushjes.

Mbushje kur ngushtohet konvertimi i të dhënave

Natyrisht, nuk mund të injoroni vendet në kod ku mund të ndodhë humbja e të dhënave për shkak të tejmbushjes. Përndryshe, variablat mund të marrin vlera të papritura, të cilat do të ndikojnë në funksionimin e programit dhe shkaku i gabimit do të jetë mjaft i vështirë për t'u gjetur.

Si parazgjedhje, dukuritë e tejmbushjes shpërfillen. Fjala kyçe e kontrolluar përdoret për të shkaktuar një përjashtim të përshtatshëm në këtë rast. Mund të vendoset ose përpara një shprehjeje specifike, ose mund të caktoni një bllok kodi me të. Më tej, kur ndodh një përjashtim, ai mund të përpunohet me konstruksionin provo dhe kap.

Random rnd = new Random (); int më i madh = rnd.Next (99999); // Gjeneron një numër të rastësishëm ndërmjet 0 dhe 99999 të shkurtër më të vogël; provo (më i vogël = i kontrolluar ((i shkurtër) më i madh);) kapur (System.OverflowException e) (Console.WriteLine ('Overflow raised by checked on smaller:' + e.ToString ()); // Printon // një mesazh rreth se është trajtuar një përjashtim më i vogël = -1;)

më i madh është një numër i rastësishëm nga 0 në 99999. Nëse kjo vlerë tejkalon diapazonin e tipit të shkurtër, do të bëhet një përjashtim Sistemi.OverflowException dhe e ndryshueshme më të vogla do t'i caktohet vlera -1. Nëse tejmbushja nuk ndodh, nuk do të ketë përjashtim, dhe ndryshorja më e vogël thjesht do të marrë vlerën e ndryshores më të madhe, por në llojin shkurt.

Është operator

Për të kontrolluar mundësinë e hedhjes së një objekti në një lloj të caktuar në C #, përdorni operatorin është... Ai kontrollon nëse një objekt është një shembull i vetë llojit të specifikuar ose rrjedh prej tij. Rezultati i një operacioni binar me operatorin is është një vlerë boolean (e vërtetë ose e gabuar).

Një shembull i përdorimit të operatorit is:

Klasa Samle1 () klasa Samle2 (): Sample1 () // Trashëgon klasën Sample1 Sample3 () Samle1 t1 = new Samle1 (); Mostra2 t2 = Samle2 e re (); Shembulli3 t3 = Mostra e re3 (); char t4 = 't'; if (t1 is Sample1) (Console.WriteLine ("t1 is Sample1");) // Do të shfaqet nëse (t2 është Sample1) (Console.WriteLine ("t2 is Sample1");) // Do të shfaqet nëse ( t3 është Sample1) (Console.WriteLine ("t3 is Sample1");) // Nuk do të shfaqet nëse (t4 është Sample1) (Console.WriteLine ("t4 është Sample1");) // Nuk do të shfaqet

Si operator

Operatori as përdoret për të kthyer llojet e referencës të pajtueshme. Vini re se nëse konvertimi dështon, nuk hidhet asnjë përjashtim, por kthehet null. Kjo duhet të merret parasysh kur përpunohet rezultati i konvertimit me as.

Klasa SamleClass () objekt Arr = objekt i ri; Arr = e re SampleClass (); Arr = “mirëseardhje”; Arr = (i shkurtër) 654; Arr = null; për (bajt i = 0; i< Arr.Length; i++) { string t1 = Arr[i] as string; SampleClass t2 = Arr[i] as SampleClass; if (t1 != null) { Console.WriteLine(“{0}: it’s a string ‘” + t1 + “’”, i+1); } else if (t2 != null) { Console.WriteLine(“{0}: it’s a SampleClass”, i+1); } else { Console.WriteLine(“{0}: it’s not string or SampleClass”, i+1); } }

Prodhimi i shembullit do të jetë si më poshtë:

1: është një SampleClass

2: "është një varg" i mirëpritur "

3: nuk është varg ose SampleClass

4: nuk është varg ose SampleClass

Konvertimi i llojeve me klasën e konvertimit

Klasa e sistemit System.Convert përmban metoda që mund të përdoren për të konvertuar vlerat e llojeve të të dhënave bazë, si dhe llojin e sistemit DateTime.

Konverto përmban një grup metodash të formës Të tipit, ku Lloji zëvendësohet me emrin e sistemit të llojit të vlerës së synuar (për shembull ToChar, ToInt32, ToBoolean). Këto metoda ju lejojnë të kryeni të gjitha konvertimet e mundshme në llojet bazë C #.

Metoda Convert.ChangeType konverton çdo objekt në çdo lloj të caktuar. Metoda bën një përjashtim nëse ka një mospërputhje tipi ose tejmbushje.

Artikujt kryesorë të lidhur