Delegátumok C#-ban - PowerPoint PPT Presentation

deleg tumok c ban n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Delegátumok C#-ban PowerPoint Presentation
Download Presentation
Delegátumok C#-ban

play fullscreen
1 / 21
Delegátumok C#-ban
132 Views
Download Presentation
gannon
Download Presentation

Delegátumok C#-ban

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. Delegátumok C#-ban Krizsán Zoltán iit 1.2

  2. Események kezelése • Nem kell vizuális felületnek lennie. • Delegátumok segítségével valósíthatja meg a .NET. Delegátumok C#-ban

  3. DelegátumokTípusos fv. pointer objektum • 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(tipusparam_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. Delegátumok C#-ban

  4. Delegátum II. • 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. Delegátumok C#-ban

  5. Delegátum IV • 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 Delegátumok C#-ban

  6. Példa delegatevoidMyDelegate(); publicclassMyClass{ publicvoidInstanceMethod(){Console.WriteLine("A messagefromtheinstancemethod.");} staticpublicvoidStaticMethod(){Console.WriteLine("A messagefromthestaticmethod.");} } publicclassMainClass{ staticpublicvoid Main(){ MyClass p = newMyClass(); MyDelegate d = newMyDelegate(p.InstanceMethod ); d(); d = newMyDelegate(MyClass.StaticMethod ); d(); } } Delegátumok C#-ban

  7. Részlet a Példa il kódjából .classprivateautoansisealedMyDelegateextends [mscorlib]System.MulticastDelegate{ .methodpublichidebysigspecialnamertspecialname instancevoid .ctor( object 'object', native int 'method‘ ) runtimemanaged { } // end of methodMyDelegate::.ctor .methodpublichidebysigvirtualinstancevoid Invoke() runtimemanaged { } // end of methodMyDelegate::Invoke .methodpublichidebysignewslotvirtual instanceclass [mscorlib]System.IAsyncResult BeginInvoke(class [mscorlib]System.AsyncCallbackcallback, object 'object') runtimemanaged { } // end of methodMyDelegate::BeginInvoke .methodpublichidebysignewslotvirtual instancevoidEndInvoke(class [mscorlib]System.IAsyncResultresult) runtimemanaged { } // end of methodMyDelegate::EndInvoke } // end of classMyDelegate Delegátumok C#-ban

  8. MulticastDelegateminden delegátum őse • _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. Delegátumok C#-ban

  9. MulticastDelegate II. • 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. Delegátumok C#-ban

  10. Delegátum lánc • 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. Delegátumok C#-ban

  11. System.Delegate • 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 Delegátumok C#-ban

  12. System.Delegate C#-ban • public static Delegate Combinehelyett operator+= • public static Delegate Removehelyettoperator-= Delegátumok C#-ban

  13. Példa II.-set osztály classSet { privateObject[] items; publicSet(Int32 numItems){ items = newObject[numItems]; for (Int32 i =0; i < numItems; i++) items[i] = i; } publicdelegatevoidFeedback(Objectvalue, Int32 item, Int32numItem); publicvoidProcessItems( Feedbackfeedback ){ for(Int32 item = 0; item< items.Length(); item++){ if ( feedback != null ){ feedback(items[item], item+1, items.Length); } } } } Delegátumok C#-ban

  14. Példa II.-App 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(); } Delegátumok C#-ban

  15. Példa II.-App 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(); } Delegátumok C#-ban

  16. IL kód • 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) Delegátumok C#-ban

  17. MulticastDelegate.Invoke Public Int32 virtual Invoke(Object value, Int32 item, Int32 numItem ) { if (_prev != null) _prev.Invoke( value, item, numItems ); return _target.methodPtr(value, item, numItems } Delegátumok C#-ban

  18. Teljes kontroll a delegátum lánc felett • 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! Delegátumok C#-ban

  19. Példa III 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!"; } } Delegátumok C#-ban

  20. Példa III-AppI 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) ); } Delegátumok C#-ban

  21. Példa III-AppII staticStringGetComponentStatusReport(GetStatus status){ if ( status == null) returnnull; StringBuildersb = newStringBuilder(); Delegate[] arrayOfDelegates = status.GetInvocationList(); foreach( GetStatusgetstatusinarrayOfDelegates ){ 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); } } returnsb.ToString(); } Delegátumok C#-ban