| I l @ ve RuBoard | 
|   Delegates are the .NET equivalent of callbacks and function pointers. They are used primarily to route events to handlers as they arrive . A delegate declaration describes a function signature with a specific pattern of parameters and a specific return type. Once this pattern is established, it might be used to invoke any function with the same signature. A difference between delegates and callbacks implemented by C++ classes is that, although callbacks in C++ must always be static members of the class, delegates can be used to invoke instance members , too. A delegate is declared like this: __delegate <return type> MyMCDelegate(<parameter list>); NOTE Delegates can have many parameters. The delegate matching pattern relies on the return type and the parameter list. Therefore __delegate char MyDelegate(int x, int y, double d) can be used on both of the following method declarations: char AFunction(int a, int b, double dData) static char Foo(int moo, int hoo, double doo) Listing 1.4.8 shows the delegate in action. It illustrates a simple delegate, a delegate that takes input parameters, delegates that return values, and those that return data throughout parameters. Listing 1.4.8 delegate.cpp : Using Delegates #using <mscorlib.dll> using namespace System; #include <stdio.h> // first declare the delegate signatures we will use. __delegate void SimpleDelegate(void); __delegate void DelegateWithParameter(int); __delegate int DelegateWithReturn(int); __delegate void DelegateWithOutParam(int,int *); __gc class AClass { public:     static void StaticHandler(int n)     {         printf("I am a static handler and Simple parameter is %d\ n",n);     }     void InstanceHandler(int n)     {         printf("I am an instance handler and Simple parameter is %d\ n",n);     }     void HandlerA()     {         printf("I am handler (a)\ n");     }     void HandlerB()     {         printf("I am handler (b)\ n");     }     void HandlerC()     {         printf("I am handler (c)\ n");     }     void HandlerD()     {         printf("I am handler (d)\ n");     }     int WithReturn(int x)     {         printf("Returning %d*5\ n",x);         return x*5;     }     void WithOutParam(int x, int *retval)     {         printf("Returning %d*14 through the out parameter\ n",x);         *retval = x*14;     } }; void main() {     // instantiate the handler class..     AClass* pC=new AClass();     // Create the delgates     DelegateWithParameter* sh=            new DelegateWithParameter(NULL,&AClass::StaticHandler);     DelegateWithParameter* ih=            new DelegateWithParameter(pC,&AClass::InstanceHandler);     DelegateWithReturn* wr=new DelegateWithReturn(pC,&AClass::WithReturn);     DelegateWithOutParam* wo=new DelegateWithOutParam(pC,&AClass::WithOutParam);     //Invoke the static...     sh->Invoke(10);     //and the instance handlers.     ih->Invoke(100);     //Now a multicast which is the invocation     //of all the handlers on a list     SimpleDelegate* mc=new SimpleDelegate(pC,AClass::HandlerA);     mc=static_cast<SimpleDelegate*>(Delegate::Combine(mc,                 new SimpleDelegate(pC,&AClass::HandlerB)));     mc=static_cast<SimpleDelegate*>(Delegate::Combine(mc,                 new SimpleDelegate(pC,&AClass::HandlerC)));     mc=static_cast<SimpleDelegate*>(Delegate::Combine(mc,                 new SimpleDelegate(pC,&AClass::HandlerD)));     mc->Invoke(); // One invoke makes four calls     //Now a delegate with an out parameter     printf("Invoking delegate with value 5\ n");     int r = wr->Invoke(5);     printf("WithReturn sent back %d\ n",r);     //finally a delegate with an out parameter     printf("Invoking delegate with value 11\ n");     wo->Invoke(11,&r);     printf("WithOutParam sent back %d\ n",r); }   |  
| I l @ ve RuBoard |