Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.

Hasonló előadás


Az előadások a következő témára: "1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz."— Előadás másolata:

1 1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz

2 2 A pointer a memória egy címét tartalmazza. Ezen a memóricen egy ‘nagy’ méretű adathalmaz található (pl string, tömb, objektum sok mezővel, …). TKor k; null... k = new TKor(); cím TKor példány mezők...

3 3 Két pointer alapú változó közötti értékadás során csak a memóriacím másolódik át! TKor k = new TKor(); TKor p = k; TKor k = new TKor(); TKor p = k; cím TKor példány mezők cím...

4 4 TKor k = new TKor(); k.sugar = 10; TKor p = k; p.sugar = 20; Console.WriteLine( k.sugar ); TKor k = new TKor(); k.sugar = 10; TKor p = k; p.sugar = 20; Console.WriteLine( k.sugar ); TKor k = new TKor(); k.sugar = 10; Beallit( k ); Console.WriteLine( k.sugar ); TKor k = new TKor(); k.sugar = 10; Beallit( k ); Console.WriteLine( k.sugar ); void Beallit( Tkor x ) { x.sugar = 25; } void Beallit( Tkor x ) { x.sugar = 25; }

5 Minden osztály típusú változó mindig pointer típusú is egyben! A pointer-t a.NET környezetben referencia-nak nevezik. A referencia változó lényegében pointer változó. A referenciák által mutatott terület típusos, és a GC felügyeli ezeket a területeket. Van ilyen fogalom is a.NET-ben, hogy pointer, de az a hagyományos pointert jelenti (C, C++ fogalom), amely nem típusos, és az általuk mutatott területeket a GC nem felügyeli ( a programozónak kell felszabadítani explicit módon).

6 Minden példány változó 4 byte helyet foglal el. Alapértelmezett értéke a ‘null’, vagyis hogy nincs még hozzá tartozó tényleges példány-terület. Két ilyen példány-változó közötti értékadás során csak a címek másolódnak át (gyors). Fv-ek felé történő paraméterátadás során ez mindig cím szerinti paraméterátadást jelent! TKor k = new TKor();... k = null; TKor k = new TKor();... k = null; Már jöhet is a GC, és takaríthatja ki a lefoglalt TKor példányt…

7 7 int a = 10; int b = a; b = 12; Console.WriteLine( a ); int a = 10; int b = a; b = 12; Console.WriteLine( a ); Nem lenne jó, ha itt a 12 íródna ki! Az alap típusok (int, bool, char, double, … ) változók nem referencia elvűek. Ezeket value-type (érték- típusoknak nevezzük). int a = 10; int b = a; b = 12;

8 Az érték-típusú változókhoz tartozó memóriaterületen maga az érték tárolódik. A közöttük történő értékadás során az érték másolódik át egyik cellából a másikba. Az ilyen típusú fv-paraméterek alapból érték szerinti paraméterátadással működnek: int a = 10; Beallit( a ); Console.WriteLine( a ); // még mindig 10 int a = 10; Beallit( a ); Console.WriteLine( a ); // még mindig 10 void Beallit( int x ) { x = 25; } void Beallit( int x ) { x = 25; }

9 Az érték-típusú változók cím szerinti paraméterátadását a ‘ref’ kulcsszóval kell megjelölni: int a = 10; Beallit( ref a ); Console.WriteLine( a ); // most 25 int a = 10; Beallit( ref a ); Console.WriteLine( a ); // most 25 void Beallit( ref int x ) { x = 25; } void Beallit( ref int x ) { x = 25; }

10 Érték-típusú osztályt tudunk csinálni, de akkor nem a ‘class’, hanem a ‘struct’ szót kell használni: Teglalap keret = new Teglalap(); struct Teglalap { public int x; public int y; public int szeles; public int magas; } struct Teglalap { public int x; public int y; public int szeles; public int magas; } x=0, y=0,

11 Ha C#-ban a struct-al definiálunk egy példányt:  Nem kell a new kulcsszót használni a példányosí- táshoz  Ha nem használjuk a new kulcsszót, akkor a struktúra mezőinek nem lesz kezdőértéke (memóriaszemét)  Ilyen osztály mezőire nem használhatunk kezdőértékadást.  Ezért a struct-nak általában van konstruktora  A paraméter nélküli (default) konstruktort a nyelv automatikusan készíti. Mi csak paraméteres konstruktort készíthetünk!

12 A struct típus korlátozott OOP tulajdonságokkal rendelkezik, pl. nem működik rá az öröklődés semmilyen formában (egy struct nem lehet ős, ő nem lehet gyermek) Ugyanakkor a struct őse is az Object Viszont implementálhat interface-t A példányosítás kevesebb memóriát igényel, mert a példány nem kerül +4 byte-ba a referencia tárolása miatt.

13 Amíg a struktúra mezői nincsenek feltöltve, addig nem használható fel (undefined). int a; int b = a+1; int a; int b = a+1; int a = 0; int b = a+1; int a = 0; int b = a+1; int a = new int(); int b = a+1; int a = new int(); int b = a+1; Az ‘int’ név valójában alias neve a System.Int32-nek! namespace System { struct Int32 {... } } namespace System { struct Int32 {... } } using System; Int32 a = new Int32(); using System; Int32 a = new Int32();

14 int[] ertekek = new int[20];... foreach(int a in ertekek) { a = 0; // hibás !!! } int[] ertekek = new int[20];... foreach(int a in ertekek) { a = 0; // hibás !!! } A fenti kód azért hibás, mert a tömbben lévő értékeket a foreach ciklus sorban átmásolja az ‘a’ változóba. De az ‘a’ változóba történő értékadás nem másolódna vissza automatikusan a vektor megfelelő elemébe, ezért értelmetlen…

15 ArrayList tanulok = new ArrayList();... foreach(Tanulo t in tanulok) { t.neve = ”Pista”; } ArrayList tanulok = new ArrayList();... foreach(Tanulo t in tanulok) { t.neve = ”Pista”; } A fenti kód azért nem hibás, mert nem a ‘t’ változó értékét módosítjuk, hanem az általa mutatott memória-területen végzünk módosításokat. Azt szabad…

16 string s = ”Hello”; string x = s; string s = ”Hello”; string x = s; A String típus nem value-type, hanem reference-type… cím ”Hello” cím... s s x x

17 string s = ”Hello”; string x = s+” akarki”; string u = s.ToUpper(); string s = ”Hello”; string x = s+” akarki”; string u = s.ToUpper(); A String típus nem value-type, hanem reference-type… cím ”Hello” ”Hello akarki” ”HELLO” x x s s cím u u

18 string s = ”a=”+a.ToString()+” Ft”; A String összefüzés nem túl hatékony: 1.valahol„a=„ 2.elkészül a„a=12” 3.elkészül a „a=12 Ft” A közben keletkezetett rész-eredményeket a GC majd el fogja takarítani… idővel… s = s.Trim().ToUpper(); Első körben s-ről levágja a bevezető és záró white space-kat (eredeti s-t a GC eltakarítja), majd nagybetűre alakítja (előző változatot GC eltakarítja)

19 String ki = ”a=”+a.ToString()+” Ft”; StringBuilder s = new StringBuilder(); s.Append( ”a=” ); s.Append( a.ToString() ); s.Append( ”Ft” ); string ki = s.ToString(); String ki = ”a=”+a.ToString()+” Ft”; StringBuilder s = new StringBuilder(); s.Append( ”a=” ); s.Append( a.ToString() ); s.Append( ”Ft” ); string ki = s.ToString(); string ki = String.Format(”a={0} Ft”,a); vagy… Ha egy string típusú értékhez folyamatosan hozzá- fűzünk, akkor célszerűbb a System.Text.StringBuilder egy példányát használni!

20 void Atallit(string s) { s = s+” es Juliska”; } void Atallit(string s) { s = s+” es Juliska”; } string mese = ”Jancsi”; Atallit( mese ); Console.WriteLine( mese ); string mese = ”Jancsi”; Atallit( mese ); Console.WriteLine( mese ); Mi fog kiíródni a képernyőre? cím ”Jancsi és Juliska” ”Jancsi” cím mese s s

21 void Atallit(ref string s) { s = s+” es Juliska”; } void Atallit(ref string s) { s = s+” es Juliska”; } string mese = ”Jancsi”; Atallit( ref mese ); Console.WriteLine( mese ); string mese = ”Jancsi”; Atallit( ref mese ); Console.WriteLine( mese ); Mi fog kiíródni a képernyőre? ”Jancsi és Juliska” ”Jancsi” cím mese s s


Letölteni ppt "1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz."

Hasonló előadás


Google Hirdetések