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

Turóczy Attila (MCT, MCP, MCTS) Livesoft Kft. C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben Property, delegate, event Típusbiztosabb, hatékonyabb.

Hasonló előadás


Az előadások a következő témára: "Turóczy Attila (MCT, MCP, MCTS) Livesoft Kft. C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben Property, delegate, event Típusbiztosabb, hatékonyabb."— Előadás másolata:

1 Turóczy Attila (MCT, MCP, MCTS) Livesoft Kft

2 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben Property, delegate, event Típusbiztosabb, hatékonyabb nyelv Generikus típusok, yield return Nyelvbe ágyazott lekérdezések Év.NETCLRC#

3 Érték típusok Nyelvi elemek Programozói típusok Referencia típusok Osztályok Típus konverzió C# 3.0

4 A.NET keretrendszer legegyszerűbb típusai. Érték típusú változók közvetlenül a hozzájuk rendelt értéket tartalmazzák. Érték típusú változók tárolása a stack-ben történik. Mindegyik érték típus a System.ValueType alap típusból származik.

5

6 Név (C# alias)MéretTartomány System.SByte (sbyte)1 byte-128 – 127 System.Byte (byte)1 byte0 – 255 System.Int16 (short)2 byte – System.Int32 (int)4 byte – System.UInt32 (uint)4 byte0 – System.Int64 (long)8 byte-9, * – 9, * System.Single (float)4 byte-3, * – 3, * System.Double (double)8 byte-1, * – 1, * System.Decimal (decimal)16 byte-7, * , * Célszerű mindig a 32 bites integereket használni (Int32, UInt32),mert a runtime erre van optimalizálva. A Float és Double használata a legköltségesebb mert azt a hardware optimalizálja.

7 Név (C# alias)MéretTartomány System.Char (char)2 byte- System.Boolean (bool)4 byte- System.IntPtrPlatform függő- System.DateTime (date)8 byte :00:00 – :59:59 Még kb. 300 beépített érték típus található a.NET keretrendszerben Ha ezek mind érték típusok akkor, hogy hogy van ToString, Equals, GetType stb metódusok?

8 Ahhoz, hogy ezeket a típusokat használjuk, deklarálnunk kell őket. Az értéktípusoknak implicit konstruktoruk van. (Nem kell használni a new kulcsszót) A konstruktor alapértelmezett 0 vagy null értéket ad. int i = 12; bool b = false; Elnevezési konvenciók: Csak (kis- és nagybetűs) betűk, számok és aláhúzás-karakterek lehetnek a nevében. A névnek betűvel kell kezdődnie (aláhúzás karakter annak számít) A C# case-sensitive nyelv!

9 Olyan érték típusú változók, amelyek null értéket is felvehetnek. A null értékkel azt jelölhetjük, ha a változó még nem kapott értéket. A nullable típusoknak HasValue és Value tulajdonságaik lesznek. A HasValue megállapítja, hogy a változónak van-e értéke. Nullable b = null; bool? b = null; //Lehetséges értékek: true, false vagy null A Nullable típus a.NET Framework 2.0 –ban jelent meg.

10

11 Érték típusok Nyelvi elemek Programozói típusok Referencia típusok Osztályok Típus konverzió C# 3.0

12 Rögzített értékek halmazából készített típus Az enum nyelvi kulcsszóval definiálhatunk felsorolásokat Tulajdonképpen csak egy szám, aminek egyes értékeihez nevet rendelünk A kód olvashatóságát segíti elő Leginkább akkor használatosak, ha egy változó értéktartományát korlátozni szeretnénk enum Szín { Piros, Zöld, Kék }; Szín s = Szín.Piros; Console.WriteLine("{0}", s);

13 Az if kulcsszó Az elágazás elejét jelzi Mindenképpen követnie kell egy feltételnek Az else kulcsszó Nem kötelező, az elágazás utolsó eleme Nincs mögötte feltétel Több feltétel is lehet && és || operátorok int i = 2; string s = "Hello"; if (i > 2) { … } else if ((i == 2) && s == ””) { … } else { … }

14 A switch kulcsszó A vizsgált változó követi A case kulcsszó A default kulcsszó Nem kötelező A break kulcsszó Nem kötelező Kilép a switchből

15 A while kulcsszó vezeti be A kulcsszót követő blokk tartalmazza a feltételt A blokk futtatása előtt vizsgálja a feltételt int i = 0; while (i < 10) { Console.WriteLine(i); i++; } // 0-tól 9ig írja ki a számokat

16 A do kulcsszó vezeti be A while kulcsszó vezeti be A kulcsszót követő blokk tartalmazza a feltételt A blokk futtatása előtt vizsgálja a feltételt int i = 0; do { Console.WriteLine(i); i++; } while (i < 10) // 0-tól 9ig írja ki a számokat

17 A for kulcsszó vezeti be A kulcsszót követő blokk tartalmazza a feltételt és a ciklusváltozót A ciklusváltozó csak az if blokkján belül érvényes A blokk futtatása előtt vizsgálja a feltételt Több ciklusváltozó is megengedett for (int i = 0; i < 10; i++) { Console.WriteLine(i); } Console.WriteLine(i); //Hiba! for (int i = 0, j = 0;... ; i++, j++) { … }

18 A foreach kulcsszó vezeti be Gyűjtemények végigfuttatására! Előre megválasztható a ciklusváltozó típusa és neve Int32[] numbers = new Int32[10]; for (int i = 0; i < 10; i++) { numbers[i]; } foreach (int number in numbers) { Console.WriteLine(number); }

19 Érték típusok Nyelvi elemek Programozói típusok Referencia típusok Osztályok Típus konverzió C# 3.0

20 Más néven struktúra (a struct nyelvi kulcsszó segítségével definiálható) „Egyszerű” típusok kompozíciója, a könnyebb kezelés érdekében Nagyon hasonlóak az osztályokhoz. Definiálhatunk bennük Adattagokat |Tulajdonságokat |Műveleteket | Eseményeket |Beágyazott típusokat Másoláskor az adat másolódik! Mikor érdemes használni? Kis típusok esetén érdemes használni. Vagy, ha logikailag összetartozó változókat fog össze (attribútumok). Ha a létrehozás után nem változtatjuk és ha nincs szükség referencia típusra való konverzióra

21 struct Cycle { private int _val, _min, _max; // Adattag public Cycle(int min_in, int max_in) // Konstruktor {... } public int Value // Tulajdonságok { get { return _val; } set { _val = value; } } public override string ToString() // Művelet {... }

22 Érték típusok Nyelvi elemek Programozói típusok Referencia típusok Osztályok Típus konverzió C# 3.0

23 A.NET keretrendszer típusainak nagy része ilyen. A referencia típusú változók a hozzájuk rendelt érték memóriacímét tartalmazzák. A referencia típusú változók a korábbi programozási nyelvek mutatóinak (pointer) feleltethetők meg. Heapben találhatók Megszüntetésükről a GC gondoskodik.

24 NévMire jó? System.ObjectA legáltalánosabb típus (minden típus közös őse) System.StringSzövegek System.Text.StringBuilderDinamikus szövegek System.ArrayAdatok tömbje (minden tömbtípus közös őse) System.IO.StreamI/O puffer System.ExceptionÁltalános kivétel (minden kivételtípus közös őse) A.NET keretrendszerben kb különféle referencia típus található.

25 Csak az utolsó String lesz referenciája! A többi a GC kisöpri. Ezen teljesítményprobléma elkerülésére használjuk a StrinBuilder osztályt string s; s = "wombat"; s += " Kangoroo"; s += " wallaby"; s += " koala"; Console.WriteLine(s); System.Text.StringBuilder sb = new StringBuilder(30); sb.Append("wombat"); sb.Append(" kangoroo"); sb.Append(" wallaby"); sb.Append(" koala"); string s = sb.ToString(); Console.WriteLine(s);

26 Tömböket egyszerűen kezelhetünk, sorba rendezhetünk. (Sokszor célszerű generikus listákat alkalmazni, mint egyszerű tömböket. Erről később) int[] ar = { 3, 1, 2 }; Array.Sort(ar); Console.WriteLine("{0}, {1}, {2}", ar[0], ar[1], ar[2]);

27 A try kulcsszó nyitja a logika blokkját A catch kulcsszó nyitja a hibakezelő blokkot – A kulcsszó után adhatjuk meg a kezelendő kivétel típusát és nevét try { StreamReader stReader = new Console.WriteLine(stReader.ReadToEnd()); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); }

28 Több catch blokkunk is lehet – Minden blokk egy típust és az abból származókat kapja csak el – A kiértékelés felülről-lefelé halad, az első nyer A legspecifikusabbtól a legáltalánosabbig haladjunk try { StreamReader stReader = new Console.WriteLine(stReader.ReadToEnd()); } catch (FileNotFoundException) { Console.WriteLine("The file could not be found"); } catch (UnauthorizedAccessException) { Console.WriteLine("Access Denied"); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); }

29 A finally kulcsszó nyitja a cleanup blokkot – A finally blokk mindenképpen lefut – Csak egy lehet belőle, a catchek után Ha van finally, nem kötelező a catch – Jellemzően a fájlok lezárását stb. tesszük ide StreamReader stReader = new try { Console.WriteLine(stReader.ReadToEnd()); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } finally { stReader.Close(); }

30 Osztály (a class nyelvi kulcsszó segítségével definiálható) Interfész (az interface nyelvi kulcsszó segítségével definiálható) Delegált (a delegate nyelvi kulcsszó segítségével definiálható) Esemény (az event nyelvi kulcsszó segítségével definiálható)

31

32

33 Érték típusok Nyelvi elemek Programozói típusok Referencia típusok Osztályok Típus konverzió C# 3.0

34 A class kulcsszó vezeti be Azonos szerkezetű objektumok halmaza (osztálydefiníció = a szerkezet leírása) Öröklés – Minden osztály a System.Object leszármazottja – Minden osztálynak csak egy őse lehet… Polimorfizmus – Őstípusként deklarált objektum értékül kaphat utódtípusút, fordítva nem! Elemei: Adattagok |Tulajdonságok |Műveletek |Események | Beágyazott típusok

35 A típusnevek nagybetűvel kezdődnek String, Int32, Byte, CultureAndRegionInfoBuilder A változók nevének első betűje kicsi MyClass myClass = new MyClass(); Az interfészek neve elé I betűt teszünk – IDisposable, Ienumerable, stb Több szóból álló neveknél: PascalCasing Egy név ne kezdődjön számmal, aláhúzással Ne álljon csupa nagybetűből egy név Programunk névterének neve ne egyezzen meg egy referált névterével se … de úgyis a cég dönt az elnevezésekről.

36 Egy értéket tartalmazó memóriaterület Az osztálydefiníció azon elemei, amelyek az osztály objektumai által tárolandó adatok szerkezetét (típusait) írják le Definíció: ; private int n;

37 public: bárki, bárhol bármit láthat private: csak az osztály/objektum maga éri el protected: csak az osztály/objektum, illetve leszármazottai érik el internal: csak az osztály és a vele egy assemblyben lévő osztályok érik el protected internal: csak az osztály, annak leszármazottai és/vagy az osztállyal egy assemblyben lévő objektumok érik el

38 Egy adattag abban a blokkban látható, ahol deklarálták Egy blokk nem deklarálhat olyan változót, melynek neve megegyezik az őt tartalmazó blokk egy változójának nevével Két egy szinten lévő blokk deklarálhat azonos nevű változót

39 Az adatok egységbezárását támogató elemek Átmenet az attribútum és a művelet között Egy mezőt szabályozottan írhatóvá és/vagy olvashatóvá tévő metóduspár Definíció: { [ ] } public string Név { get { return this.név; } set { this.név = value; } }

40 Az objektumok létrehozásában, az attribútumok kezdeti értékeinek beállításában játszanak fontos szerepet Speciális műveletek – A konstruktor neve azonos az osztály nevével! – Olyan művelet, amelynek nincs típusa

41 class Kör { private double sugár; public double Sugár { get { return sugár; } set { if(value > 0) sugár = value; } public Kör(double sugár_in) { sugár = sugár_in; } public double Kerület() { return 2 * 3.14 * sugár; }

42 Olyan osztályok melyek esetében az osztály teljes definíciója több forrásfájlban szétosztva található A partial nyelvi kulcsszóval jelölhetjük Ez a szétválasztás általában a kód olvashatóságát segíti elő

43

44 Olyan osztály, melynek legalább egy absztrakt (megvalósítás nélküli) művelete van abstract class Sokszög { private int csúcsok; public abstract double Kerület(); public abstract double Terület(); }

45 Deklaratív címkék – Az adott tag viselkedését (is) szabályozhatják – A metaadatokkal együtt kerülnek tárolásra – Reflexió segítségével felhasználhatjuk őket [attribute(positional_params,named_param=value,...)] element using System.Runtime.Serialization;... [Serializable] public class MyClass() { }

46 Kizárólag absztrakt (megvalósítás nélküli) műveleteket tartalmazó típus Csak metódus-szignatúrákat tartalmazhatnak! Nem példányosíthatók – De egy interfészt megvalósító objektumra lehet interfészként hivatkozni Egy osztály akárhány interfészt megvalósíthat Minta az interfészt megvalósító osztályok számára interface Síkidom { double Kerület(); double Terület(); }

47 InterfészLeírás IComparable Az interfészt implementáló osztályok objektumainak rendezését teszi lehetővé IDisposable A manuális felszabadítást teszi lehetővé az implementáló osztályokban IConvertible Az implementáló osztály objektumainak alaptípusra való konverzióját teszi lehetővé ICloneable Az implementáló osztály objektumainak másolását teszi lehetővé IEquatable Az egyenlőség vizsgálatát teszi lehetővé az implementáló osztályokban IFormattable Az implementáló osztály objektumainak formázott szövegre való konverzióját teszi lehetővé

48

49 Olyan üzenet, amelyet egy objektum küld egy másiknak egy adott esemény bekövetkezése esetén Az event kulcsszó vezeti be. (Valójában egy Delegate van mögötte) A paramétereket ajánlott EventArgs leszármazott formájában átadni Az eseményt előidézheti – A felhasználó – Valamely program Az eseménykezelés mechanizmusa delegáltak használatára épül. A delegate nem más mint referencia egy metódusra. (Típus biztos funkció pointer)

50 A delegate referencia egy metódusra. (Típus biztos funkció pointer) A delegate kulcsszó vezeti be. A delegált és a hivatkozott metódus visszatérési értékének és paramétereinek egyezniük kell

51 Definiálás Feliratkozás Feliratkozottak értesítése public delegate void PlayCallback(); private event PlayCallback MozartStarted; Listener lis = new Listener(); MozartStarted += new PlayCallback(lis.Listen); public void StartMozart() { if (MozartStarted != null) { MozartStarted(); }

52

53 A típusok csoportosításának eszköze A namespace nyelvi kulcsszóval definiálható

54 Olyan típus, amely definíciójában valamely típusnév paraméter formájában szerepel (típusparaméter) Az objektumreferencia deklarációjában kell meghatározni a típusparaméter helyébe behelyettesítendő konkrét típust (típuspéldányosítás) A típusparaméterre megszorítások tehetők, így csak a megfelelő típusokkal végezhető el a típuspéldányosítás

55

56 Érték típusok Nyelvi elemek Programozói típusok Referencia típusok Osztályok Típus konverzió C# 3.0

57 Fejlesztés során gyakori scenario, hogy típusok között konverziót végezzünk. Kétféle konverziós lehetőség: – Implicit (automatikus) konverzió – Explicit (erőltetett) konverzió

58 Automatikusan végbemegy Nem kell jelölni Nem dobhat kivételt Bővítő konverzióknál automatikus Csak olyan típusok között van rá lehetőség, ahol a forrás típus minden elemének megfelelhető az új típus egy eleme

59 A kódban jelezni kell a konverziós szándékot InvalidCastException –t dobhat Megoldható: – Convert osztály statikus műveleteivel – type cast operátorral – A ToString() művelet felüldefiniálásával – A Parse() művelet felüldefiniálásával – A TryParse() művelet felüldefiniálásával

60 Boxing: értéktípus -> referenciatípus Ha egy értéktípusú változót referencia típusúként használunk, dobozolásra kerül sor Unboxing: referenciatípus -> értéktípus Az un/boxing lassít, kerülendő! -> Generics!

61 Átalakítja az objektumot, ha nem tudja, null-t ad vissza – nincs kivétel!

62

63 Érték típusok Nyelvi elemek Programozói típusok Referencia típusok Osztályok Típus konverzió C# 3.0

64 C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben Property, delegate, event Típusbiztosabb, hatékonyabb nyelv Generikus típusok, yield return Nyelvbe ágyazott lekérdezések

65

66 Egyszerűsíti a tulajdonságok létrehozását prop Code Snippet: prop tab tab Kell a get és a set rész is. Nem hagyható el! ”ReadOnly-ság hoz, set –et állítsuk privátra. private string name; public string Name { get { return name; } set { name = value; } } public string Name { get; set; } //Read Only public string Name { get; private set; }

67

68 Ha egy osztályból szeretnénk egy példányt létrehozni, megfelelő paraméterekkel, akkor szükségünk volt egy megfelelően felparaméterezett konstruktorra. Ha a konstruktor nem volt képes minden számunkra szükséges tagváltozót beállítani, akkor kénytelenek voltunk property-k segítségével megtenni azt. C# 2.0 C# 3.0

69 Mezők és tulajdonságok beállítása Nem kötelező minden mezőt kitölteni Paraméter nélküli konstruktornál a zárójel sem kell Nagyon kényelmes Music b0=new Music(); b0.Title="Soul Bop"; b0.Length=591; Music b0=new Music(); b0.Title="Soul Bop"; b0.Length=591;

70

71 Meglévő osztályokat tudunk kiterjeszteni a segítségével. (Származtatás nélkül)Létrehozása: Publikus statikus függvény, statikus osztályban Az első paraméter a bővítendő osztály típusa Megelőzi a ”this” kulcsszó Csak publikus adattagokhoz fér hozzá

72

73 Nem kell kiírni a lokális változó típusát A változó típusa a jobb oldali kifejezés típusa lesz var == a jobboldal típusa Továbbra is erősen típusos! A fordító kitalálja a környezetből hogy milyen típusú egy lokális változó

74

75 => operátor Olyan, mint a névtelen metódus, csak tömörebb és kifejezőbb

76 Névtelen metódusok még rövidebb szintaktikával delegate( string s ) { return s.StartsWith( "S" ); } Ugyanaz mint: s => s.StartsWith( "S" ) ‘s’ típusát kitalálja a környezetből! Több paraméter esetén a szintaktika ( x, y ) => Math.Sqrt( x * x + y * y )

77

78 C# 3.0 –tól létrehozhatunk Anonymous típusokat. Legnagyobb előnye Linq lekérdezéseknél lehet. Segítségével nem kell segédosztályt definiálnunk, a compiler elkészítette nekünk. Nincs szükség fölösleges többlet munkára. {Name = "<>f__AnonymousType0`2" FullName = "<>f__AnonymousType0`2[[System.String, mscorlib, Version= , Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version= , Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}

79 Az osztály az inicializáláskor kapott tagokat kapja Tulajdonságok ToString(), Equals( object ), GetHashCode() Azonos típus- és névsorrend ugyanazt a típust hivatkozza var list = new [ ] { new { Title = "Soul Bop", Length = 591 }, new { Title = "Hangin' in the City", Length = 397 } }; foreach( var x in list.Filter( s => s.Length < 300 ) ) Console.WriteLine( x );

80

81 A C# 2.0 -ban megismert partial class képességeit bővíti ki. (Az osztályok kódját szétszórhattuk több forrásfájlba, és ha mindkét helyen megjelöltük classunkat a partial kulcsszóval, akkor a fordító szépen összefésülte őket.) C# 3.0 –tól megjelölhetünk metódusokat is a parital kulcsszóval. A fordító, ahogy a parciális osztályokat a parciális osztályokat és azok hívásait is összefésüli. // Auto-generated part: public partial class PartialExampleType { public void GeneratedMethod() { Console.WriteLine("GeneratedMethod() calls PartialMetod()"); PartialMethod(); } partial void PartialMethod(); } // Developer-written part: public partial class PartialExampleType { partial void PartialMethod() { Console.WriteLine("PartialMethod (\"{0}\") called."); }

82 Nem muszáj megvalósítani. Ha nem valósítjuk meg a parciális metódust, a fordító nem fordítja be a hívást. // Auto-generated part: public partial class PartialExampleType { public void GeneratedMethod() { Console.WriteLine("GeneratedMethod() calls PartialMetod()"); PartialMethod(); } partial void PartialMethod(); } // Developer-written part: public partial class PartialExampleType { partial void PartialMethod() { Console.WriteLine("PartialMethod (\"{0}\") called."); }

83 © 2006 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.


Letölteni ppt "Turóczy Attila (MCT, MCP, MCTS) Livesoft Kft. C# 1.0 C# 2.0 C# 3.0 Komponensek felügyelt környezetben Property, delegate, event Típusbiztosabb, hatékonyabb."

Hasonló előadás


Google Hirdetések