1 / 20

Delegátumok C#-ban

Delegátumok C#-ban. Krizsán Zoltán iit 1.0. 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. Biztonságos kódkészítés miatt tiltott a pointer aritmetika a C#-ban. Fv. Pointer helyett delegátum

sydnee-holt
Download Presentation

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.0

  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 • 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,..) • Ha megadjuk a paraméter típusát, akkor a paraméter nevét is meg kell adni! 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. Delegátumok C#-ban

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

  6. Részlet a Példa il kódjából .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 Delegátumok C#-ban

  7. 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

  8. 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

  9. 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

  10. 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

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

  12. Példa II.-set osztály 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); } } } } Delegátumok C#-ban

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

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

More Related