1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy Károly Főiskola Számítástudományi tsz
2 Value type (érték-típus) int a; Deklarál egy új azonosítót („a”) Tartalmazza, hogy az új azonosító egy „egész szám tárolására képes” változó A memóriában azonnal területet foglal le neki (4 byte) Az „a” –ban helyezett értéket közvetlenül ezen a memóriaterületen fogja tárolni
3 Value type (érték-típus) a=50; Írási művelet erre a memóriaterületre. 4 byte 50 int b=a*2; a Olvasási művelet erről a memóriaterületről.
4 Value type (érték-típus) Egészek Valósak Karakter Logikai Érték-típusok Vagyis a fenti típusú változók a fentiekben ismertetett módon kerülnek kezelésre.
5 Reference type (referencia-típus) class Hallgato { public int eletkor; public string neve; public bool ferfi; } class Hallgato { public int eletkor; public string neve; public bool ferfi; } Hallgato h;
6 Reference type (referencia-típus) Hallgato h; Deklarál egy új azonosítót („h”) Tartalmazza, hogy az új azonosító egy „egész hallgató tárolására képes” változó A memóriában azonnal területet foglal le neki (de mennyit ???)
7 Reference type (referencia-típus) Hallgato h; 4 byte null h 4 byte-on egy memóriacímet lehet eltárolni A „null” egy speciális memóriacím, azt jelenti SEHOL (ÜRES, SEMMI)
8 Vagyis a fenti típusú változók a fentiekben ismertetett módon kerülnek kezelésre. Reference type (referencia-típus) String Tömbök Osztályok Referencia- típusok
1 db Hallgato számára elég byte 9 Reference type (referencia-típus) h = new Hallgato(); 4 byte 1 1 h new <- memóriafoglalás Hallgato() <- feltöltés kezdőértékekkel eletkor | nev | ferfi 1
10 Reference type (referencia-típus) h.eletkor = 20; 1 1 h h <- keresd meg a memóraterületet h. <- kövesd a linket h.eletkor <- tárold el az értéket eletkor | nev | ferfi
11 Reference type (referencia-típus) Hallgato h; h.eletkor = 20; Hallgato h; h.eletkor = 20; Nem működik, mert a ‘null’ linket nem lehet követni ! Hallgato h = new Hallgato(); h.eletkor = 20; Hallgato h = new Hallgato(); h.eletkor = 20; Ez működik, mert addigra lesz a memóriában Hallgató, és a linkje ott lesz a ‘h’ változóban! Hallgato h; eletkor = 20; Hallgato h; eletkor = 20; Nem működik, hacsak ‘eletkor’ nevű változónk nincsen önnmagában!
12 Reference type (referencia-típus) Hallgato h; h.eletkor = 20; Hallgato h; h.eletkor = 20; Nem működik, mert a ‘null’ linket nem lehet követni ! Hallgato h = new Hallgato(); h.eletkor = 20; Hallgato h = new Hallgato(); h.eletkor = 20; Ez működik, mert addigra lesz a memóriában Hallgató, és a linkje ott lesz a ‘h’ változóban!
13 Reference type (referencia-típus) Hallgato h= new Hallgato(); h.eletkor = 20; Hallgato k = h; Console.WriteLine(k.eletkor); // ??? Hallgato h= new Hallgato(); h.eletkor = 20; Hallgato k = h; Console.WriteLine(k.eletkor); // ??? 1 1 h eletkor | nev | ferfi 1 1 k
14 Reference type (referencia-típus) Hallgato k = h; Nem készít másolatot a ‘h’-ban tárolt hallgatóról! Mindössze a ‘h’-ban tárolt memóriacímet másolja bele a ‘k’-ba. Így a ‘h.eletkor’ és ‘k.eletkor’ innentől kezdve ugyanazt jelenti. Ez az értékadás gyors, mindössze 4 byte-t kell másolni a memóriában!
15 Reference type (referencia-típus) Hallgato h = new Hallgato(); h.nev = ”Pistike”; … h = new Hallgato(); h.eletkor = 20; Console.WriteLine(h.nev); // ???? Hallgato h = new Hallgato(); h.nev = ”Pistike”; … h = new Hallgato(); h.eletkor = 20; Console.WriteLine(h.nev); // ???? 2 2 h eletkor | nev | ferfi 12
16 Reference type (referencia-típus) for(int i=0;i<10;i++) { Hallgato h = new Hallgato(); h.nev = Console.ReadLine(); } Console.WriteLine(h.nev); // ???? for(int i=0;i<10;i++) { Hallgato h = new Hallgato(); h.nev = Console.ReadLine(); } Console.WriteLine(h.nev); // ???? Szintaktikai hibás, hiszen a ‘h’ változó a for blokkján belül lett deklarálva, így a blokkon kívül nem használható!
17 Reference type (referencia-típus) Hallgato h; for(int i=0;i<10;i++) { h = new Hallgato(); h.nev = Console.ReadLine(); } Console.WriteLine(h.nev); // ???? Hallgato h; for(int i=0;i<10;i++) { h = new Hallgato(); h.nev = Console.ReadLine(); } Console.WriteLine(h.nev); // ???? A legutoljára beírt hallgató nevét fogja visszaírni a képernyőre. A többi hallgató adatai elvesztek már régen.
40 * 4 byte 18 Reference type (referencia-típus) Hallgato[] t; null t 4 byte Hallgato[] t = new Hallgato[40]; 1 1 t null | null | null | null | … | null 1
19 Reference type (referencia-típus) Hallgato[] t = new Hallgato[40]; t[0].nev = ”Pistike”; // ???? Hallgato[] t = new Hallgato[40]; t[0].nev = ”Pistike”; // ???? 1 1 t null | null | … | null 1 Ez nem működik, mert a t[0] –nál ‘null’ van, és annak nem lesz.nev mezője sehol a memóriában!
20 Reference type (referencia-típus) Hallgato[] t = new Hallgato[40]; t[0] = new Hallgato(); t[0].nev = ”Pistike”; Hallgato[] t = new Hallgato[40]; t[0] = new Hallgato(); t[0].nev = ”Pistike”; 1 1 t 2 | null | … | null 1 eletkor | nev | ferfi 2 Ez működik!
21 Reference type (referencia-típus) Hallgato t = new Hallgato[40]; Ezért kell egy ciklus, amely feltölti a tömbelemeket tényleges memóriacímekkel! Ez a művelet meg kell előzze a tömbelemek használatát! for(int i=0;i<t.Length;i++) { t[i] = new Hallgato(); } for(int i=0;i<t.Length;i++) { t[i] = new Hallgato(); } Ez még csak a 40 darab memóriacím számára foglal le helyet (40*4 byte), de a tömbelemek egyelőre ‘null’ értékkel rendelkeznek, így nem használhatóak fel tényleges adattárolásra!
30 * 8 byte ( 1 double=8 byte) 22 Reference type (referencia-típus) double[] t = new double[30]; t 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | … | 0.0 A value-type alapú tömbökre ez nem vonatkozik, mivel ott a tömbelem már rögtön az értéket tárolja
23 Reference type (referencia-típus) Hallgato tomb = new Hallgato[40]; foreach(Hallgato h in tomb) h = new Hallgato(); Hallgato tomb = new Hallgato[40]; foreach(Hallgato h in tomb) h = new Hallgato(); Ez (ha működne) létrehozna a memóriában 40 db Hallgato-t, amelyeknek a címeit a ‘h’-ba másolná, de minden ciklusmenet végén el is dobná, mivel a ‘h’-ból ez a memóriacím nem kerül vissza a tömbbe! 1 1 tomb null | null | … | null 1 h ???
24 Reference type (referencia-típus) Random rnd = new Random(); A jól ismert Random is ilyen típusú változó (class alapú). namespace System { class Random { … } namespace System { class Random { … }
25 Reference type (referencia-típus) ArrayList l = new ArrayList(); A jól ismert ArrayList is ilyen típusú változó (class alapú). namespace System.Collections { class ArrayList { … } namespace System.Collections { class ArrayList { … }
26 Reference type (referencia-típus) ArrayList l = new ArrayList(); Az ArrayList eleve csak memóriacímeket tárol, de induláskor nulla darabot, úgy kell őket egyesével hozzáadogatni: for (int i=0;i<10;i++) { Hallgato h = new Hallgato(); h.nev = Console.ReadLine(); … l.Add( h ); } for (int i=0;i<10;i++) { Hallgato h = new Hallgato(); h.nev = Console.ReadLine(); … l.Add( h ); }
27 Reference type (referencia-típus) string s = ”Hello Vilag!” 1 1 s H | e | l | l | o | | V | i | l | a | g | ! | \0 1 string m = s; A másik string változó (‘m’) csak 4 byte-ba kerül, és ugyanarra a szövegre fog mutatni. 1 1 m
28 Reference type (referencia-típus) string s = ”Hello Vilag!”; string m = s; … s = Console.ReadLine(); m = s; s = s.ToUpper(); … s = m.SubString(3,5); string s = ”Hello Vilag!”; string m = s; … s = Console.ReadLine(); m = s; s = s.ToUpper(); … s = m.SubString(3,5); Minden egyes értékadó utasítás a memóriacím-átállításával jár az új szövegre.
29 Reference type (referencia-típus) string s = ”Hello Vilag!” 1 1 s Hello Vilag! 1 s= s.ToUpper(); // másolatot hoz létre 2 2 s Hello Vilag! 1 HELLO VILAG! 2
30 Reference type (referencia-típus) string s = ”Hello Vilag!” s= s.SubString(3,5); // másolatot hoz létre 2 2 s Hello Vilag! 1 lo Vi 2 s= s.SubString(3,5).ToUpper(); 3 3 s Hello Vilag! 1 lo Vi 2 LO VI 3
31 Reference type (referencia-típus) string s = ”Hello Vilag!” s= s + ”Sziasztok!” 2 2 s Hello Vilag! 1 Hello Vilag! Sziasztok! 2
32 Reference type (referencia-típus) string s = ”Hello Vilag!”; string m = ”Sziasztok!”; string s = s+”, ”+m; string s = ”Hello Vilag!”; string m = ”Sziasztok!”; string s = s+”, ”+m; 3 3 s Hello Vilag! 1 2 Hello Vilag!, Hello Vilag!, Sziasztok! 3