Krizsán Zoltán iit 1.2.  Nem kell vizuális felületnek lennie.  Delegátumok segítségével valósíthatja meg a.NET. Krizsán Zoltán iit Delegátumok C#-ban2.

Slides:



Advertisements
Hasonló előadás
C# nyelvi áttekintő A „Programozás C# nyelven (Illés Zoltán)”
Advertisements

4. alkalom – Hálózat Kezelés
Osztály leszármaztatás
Krizsán Zoltán iit 1.1.  Aszinkron történésről értesítés egy vagy több objektum számára.  Delegátumok segítségével valósítja meg a C#.  event típus,
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
HÁLÓZAT SOAP Hagyományos WCF/ASMX webszervizek.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Öröklődés 2..
© Kozsik Tamás Tömbök, kollekciók és egyéb alaposztályok.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
4. előadás (2005. március 8.) Pointerek Pointer aritmetika
Fájlkezelés, IO Kivételkezelés Belső osztályok
Abstract osztályok és interface-ek Beolvasás és kiíratás 7. gyakorlat.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Követelmények Bevezetés a Javába Első java program írása Dokumentációk
Tömbök ismétlés Osztályok Java-ban Garbage collection
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
Java programozási nyelv 3. rész – Osztályok I.
C# Alapok Krizsán Zoltán.
C# tagfüggvények.
Delegátumok C#-ban Krizsán Zoltán iit 1.0.
C# osztályok Krizsán Zoltán 1.0.
C# osztályok Krizsán Zoltán 1.1.
C# tagfüggvények.
Krizsán Zoltán.  Ha az algoritmus sokáig dolgozik,  de el akarjuk kerülni a „fagyást”.  Kisebb a költsége, mint az új folyamatnak.  Programozás szempontjából.
V 1.0 Szabó Zsolt, Óbudai Egyetem, Haladó Programozás Eseménykezelés ismétlés Névtelen metódusok (anonymous methods)
Framework fundamentumok
Ficsor Lajos Template-ek CPP8/ 1 Template-ek. Ficsor Lajos Template-ek CPP8/ 2 A template fogalma Kiindulási probléma: tetszőleges típusokon kellene ugyanolyan.
Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék
Kivételkezelés a C++ nyelvben Bevezetés
P ROGRAMOZÁS C# - BAN Kivételkezelés. P ÉLDA I. Nullával való osztás miatt kapjuk a hibaüzenetet.
V 1.0 OE-NIK HP 1 Programozási Paradigmák és Technikák Eseménykezelés Névtelen metódusok (anonymous methods)
Összetett adattípusok
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
J.Zs.Cs.: Vizuális programozás (c) 2010 Vizuális programozás Fájl- és állományrendszer kezelés Névtér: System.IO.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
V 1.0 Szabó Zsolt, Óbudai Egyetem, Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus.
V 1.0 Szabó Zsolt, Óbudai Egyetem, Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus.
Java programozási nyelv Filekezelés
Java programozási nyelv Metódusok
Java programozási nyelv Adatbekérés konzolról
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
Haladó Programozás System.Threading.Tasks.Task OE-NIK HP.
Haladó Programozás Delegáltak, események OE-NIK HP 1.
Haladó Programozás Reflexió OE-NIK HP.
Szebb és használhatóbb programok Vezérlőelemek dinamikus felhelyezése.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás I. 7. gyakorlat.
Objektum orientált programozás 4. Mutatók, típusok és struktúrák Nagy Szilvia.
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 6. gyakorlat.
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 7. gyakorlat.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
Hernyák Zoltán Programozási Nyelvek II.
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Függvénysablonok használata
Előadás másolata:

Krizsán Zoltán iit 1.2

 Nem kell vizuális felületnek lennie.  Delegátumok segítségével valósíthatja meg a.NET. Krizsán Zoltán iit Delegátumok C#-ban2

 Biztonságos kódkészítés miatt tiltott a pointer aritmetika a C#-ban.  Fv. Pointer helyett delegátum  Alakja: delegate típus nev(tipus param_nev,..)  Objektum, ami biztonságos hozzáférést biztosít.  Ha megadjuk a paraméter típusát, akkor a paraméter nevét is meg kell adni!  Képviselőnek is hívják. Krizsán Zoltán iit Delegátumok C#-ban3

 Nem csak a fv. címe, de visszatérési érték + paraméterek  Amire hivatkozik, lehet: Statikus fv. Példány fv.  Aszinkron hívás támogatás.  Egy hívás -> több hívás.  System.MulticastDelegate pecsételt származott. Krizsán Zoltán iit Delegátumok C#-ban4

 Listán tárolja a feliratkozott függvényeket  belső fv.eket definiál Invoke – szinkron hívásra BeginInvoke, EndInvoke – aszinkron hívásra Krizsán Zoltán iit Delegátumok C#-ban5

delegate void MyDelegate(); public class MyClass{ public void InstanceMethod(){Console.WriteLine("A message from the instance method.");} static public void StaticMethod(){Console.WriteLine("A message from the static method.");} } public class MainClass{ static public void Main(){ MyClass p = new MyClass(); MyDelegate d = new MyDelegate( p.InstanceMethod ); d(); d = new MyDelegate( MyClass.StaticMethod ); d(); } Krizsán Zoltán iit Delegátumok C#-ban6

.class private auto ansi sealed MyDelegate extends [mscorlib]System.MulticastDelegate{.method public hidebysig specialname rtspecialname instance void.ctor( object 'object', native int 'method‘ ) runtime managed { } // end of method MyDelegate::.ctor.method public hidebysig virtual instance void Invoke() runtime managed { } // end of method MyDelegate::Invoke.method public hidebysig newslot virtual instance class [mscorlib]System.IAsyncResult BeginInvoke(class [mscorlib]System.AsyncCallback callback, object 'object') runtime managed { } // end of method MyDelegate::BeginInvoke.method public hidebysig newslot virtual instance void EndInvoke(class [mscorlib]System.IAsyncResult result) runtime managed { } // end of method MyDelegate::EndInvoke } // end of class MyDelegate Krizsán Zoltán iit Delegátumok C#-ban7

 _target (System.Object): az objektumra referál, amely a call back fv.- hez kapcsolódik (csak példány fv. esetén).  _methodPtr (System.Int32): egész szám, amellyel a CLR azonosítja a fv.-t.  _prev (System.MulticastDelegate): a láncolt lista előző elemére mutat. Krizsán Zoltán iit Delegátumok C#-ban8

 Két fontos tulajdonság: Target->_target Method->_methodPtr  Az Invoke fv. nem hívható meg közvetlenül (VB-ben viszont kötelező).  Equals újradefiniált, igaz, ha _target és _methodPtr azonosakra referál. Krizsán Zoltán iit Delegátumok C#-ban9

 A delegátum önmagában is hasznos, de láncolt listára fűzve hatékonyabb  _prev az előző elemre. Kezdetben null, később áll be egy érvényes objektumra. Krizsán Zoltán iit Delegátumok C#-ban10

 public static Delegate Combine(Delegate tail, Delegate head) : hozzáfűz a listához  public static Delegate Combine(Delegate[] delegateArray) : hozzáfűz a listához  public static Delegate Remove(Delegate source, Delegate value) : töröl a listából Krizsán Zoltán iit Delegátumok C#-ban11

 public static Delegate Combine helyett operator+=  public static Delegate Remove helyett operator-= Krizsán Zoltán iit Delegátumok C#-ban12

class Set { private Object[] items; public Set(Int32 numItems){ items = new Object[numItems]; for (Int32 i =0; i < numItems; i++) items[i] = i; } public delegate void Feedback(Object value, Int32 item, Int32 numItem); public void ProcessItems( Feedback feedback ){ for(Int32 item = 0; item< items.Length(); item++){ if ( feedback != null ){ feedback(items[item], item+1, items.Length); } } Krizsán Zoltán iit Delegátumok C#-ban13

static void Main(){ StaticCallbacks(); InstanceCallbacks(); } static void StaticCallbacks() { Set setOfItems = new Set(5); setOfItems.ProcessItems (null);Console.WriteLine(); setOfItems.ProcessItems ( new Set.Feedback(App.FeedbackToConsole) ); Console.WriteLine(); setOfItems.ProcessItems ( new Set.Feedback(App.FeedbackToMsgBox) ); Console.WriteLine(); Set.Feedback fb = null; fb += new Set.Feedback(App.FeedbackToConsole); fb += new Set.Feedback(App.FeedbackToMsgBox); setOfItems.ProcessItems(fb);Console.WriteLine(); } static void InstanceCallbacks() { Set setOItems = new Set(5); App appobj = new App(); setOItems.ProcessItems( new Set.Feedback(appobj.FeedbackToFile) ); Console.WriteLine(); } Krizsán Zoltán iit Delegátumok C#-ban14

static void FeedbackToConsole(Object value, Int32 item, Int32 numItems){ Console.WriteLine("Processing item {0} of {1}: {2}.", item, numItems, value); } static void FeedbackToMsgBox(Object value, Int32 item, Int32 numItems){ MessageBox.Show(String.Format("Processing item {0} of {1}: {2}.", item, numItems, value)); } void FeedbackToFile(Object value, Int32 item, Int32 numItems){ StreamWriter sw = new StreamWriter("Status", true); sw.WriteLine("Processing item {0} of {1}: {2}.",item,numItems, value); sw.Close(); } Krizsán Zoltán iit Delegátumok C#-ban15

 Nézzük meg az IL kódot!  feedback( items[item], item+1, items.Length ); helyett: IL_001b: callvirt instance void Set/Feedback::Invoke(object, int32, int32) Krizsán Zoltán iit Delegátumok C#-ban16

Public Int32 virtual Invoke(Object value, Int32 item, Int32 numItem ) { if (_prev != null) _prev.Invoke( value, item, numItems ); return _target.methodPtr(value, item, numItems } Krizsán Zoltán iit Delegátumok C#-ban17

 public virtual Delegate[] GetInvocationList()  Klónozza a lista elemeit egy tömbbe, de minden elem _prev-je null.  A visszaadott tömbön végigjárhatunk! Krizsán Zoltán iit Delegátumok C#-ban18

class Light{ public String GetPosition() { return "Villany felkapcsolva!"; } class Fan{ public String Speed() { throw new Exception("Nagyon gyors!"); } class Speaker{ public String Volume(){ return "Nagyon hangos!"; } Krizsán Zoltán iit Delegátumok C#-ban19

delegate string GetStatus(); static public void Main() { GetStatus getstatus = null; getstatus += new GetStatus( new Light().GetPosition ); getstatus += new GetStatus( new Fan().Speed ); getstatus += new GetStatus( new Speaker().Volume ); Console.WriteLine( GetComponentStatusReport(getstatus) ); } Krizsán Zoltán iit Delegátumok C#-ban20

static String GetComponentStatusReport(GetStatus status){ if ( status == null) return null; StringBuilder sb = new StringBuilder(); Delegate[] arrayOfDelegates = status.GetInvocationList(); foreach( GetStatus getstatus in arrayOfDelegates ){ try{ sb.AppendFormat("{0}{1}{1}", getstatus(), Environment.NewLine); } catch(Exception e){ Object o = getstatus.Target; sb.AppendFormat("Hiba keletkezett: {1}{2}{0} Hiba: {3}{0}{0}", Environment.NewLine, ((o == null) ? "" : o.GetType() + "."), getstatus.Method.Name, e.Message); } return sb.ToString(); } Krizsán Zoltán iit Delegátumok C#-ban21