В чем разница между связанными и несвязанными делегатами?
Вот как вы создаете делегатов обоих типов:
// bound delegate declaration
public delegate void Handler(int value);
// create a bound delegate
Handler^ handler = gcnew Handler(HandlerClass::Fun1);
// unbound delegate declaration
public delegate void UBHandler(ThisClass^, int value);
// create an unbound delegate
UBHandler^ ubh = gcnew UBHandler(&ThisClass::Sum);
это почти то же самое. затем вы можете создавать конструкторы для связанных делегатов, которые состоят из двух параметров:
HandlerClass^ obj = gcnew HandlerClass;
Handler^ handler2 = gcnew Handler (obj, & HandlerClass::Fun3);
это означает, что вы можете использовать этот конкретный делегат для вызова функции, которая не является статической (является экземпляром). но тогда вы можете сделать то же самое с несвязанными делегатами. Вот как вы можете вызвать делегата ubh:
ThisClass^ obj = gcnew ThisClass(99.0);
ubh(obj, 5);
Так какой смысл иметь оба типа?
// code for HandlerClass
public ref class HandlerClass
{
public:
static void Fun1(int m)
{ Console::WriteLine(L”Function1 called with value {0}”, m); }
static void Fun2(int m)
{ Console::WriteLine(L”Function2 called with value {0}”, m); }
void Fun3(int m)
{ Console::WriteLine(L”Function3 called with value {0}”, m+value); }
void Fun4(int m)
{ Console::WriteLine(L”Function4 called with value {0}”, m+value); }
HandlerClass():value(1){}
HandlerClass(int m):value(m){}
protected:
int value;
};