различия между связанными и несвязанными делегатами в CLI / C ++ - PullRequest
1 голос
/ 07 сентября 2011

В чем разница между связанными и несвязанными делегатами?

Вот как вы создаете делегатов обоих типов:

// 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;
};

1 Ответ

2 голосов
/ 08 сентября 2011

Разница - это точное время создания значения целевого объекта.С связанным делегатом это генерируется, когда вы создаете объект делегата, и это навсегда остается неизменным после этого.Несвязанный делегат не сохраняет ссылку на объект, он генерируется во время вызова делегата.Затем один и тот же делегат можно использовать для вызова целевого метода с различными объектами.

Несвязанные делегаты соответствуют синтаксису указателей на функции-члены C ++.В C ++ нет прямого эквивалента для связанных делегатов.

...