1 / 21

Delegátumok C#-ban

Delegátumok C#-ban. Krizsán Zoltán iit 1.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 Típusos fv . pointer objektum. Biztonságos kódkészítés miatt tiltott a pointer aritmetika a C# -ban .

gannon
Télécharger la présentation

Delegátumok C#-ban

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

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

More Related