deleg tumok c ban
Download
Skip this Video
Download Presentation
Delegátumok C#-ban

Loading in 2 Seconds...

play fullscreen
1 / 20

Delegátumok C#-ban - PowerPoint PPT Presentation


  • 70 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Delegátumok C#-ban' - sydnee-holt


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
deleg tumok c ban

Delegátumok C#-ban

Krizsán Zoltán

iit

1.0

esem nyek kezel se
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

deleg tumok t pusos fv pointer
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

deleg tum ii
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

p lda
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

r szlet a p lda il k dj b l
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

multicastdelegate minden deleg tum se
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

multicastdelegate ii
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

deleg tum l nc
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

system delegate
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

system delegate c ban
System.Delegate C#-ban
  • public static Delegate Combinehelyett operator+=
  • public static Delegate Removehelyettoperator-=

Delegátumok C#-ban

p lda ii set oszt ly
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

p lda ii app
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

p lda ii app1
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

il k d
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

multicastdelegate invoke
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

teljes kontroll a deleg tum l nc felett
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

p lda iii
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

p lda iii appi
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

p lda iii appii
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

ad