CLI / C ++中绑定和未绑定委托之间的差异

时间:2011-09-07 19:23:17

标签: delegates c++-cli

绑定和非绑定代理之间的区别是什么?

以下是如何创建两种类型的委托:

// 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 个答案:

答案 0 :(得分:2)

不同之处在于生成目标对象值的确切时间。使用绑定委托时,它会在您创建委托对象时生成,并且在此之后永远不变。未绑定的委托不存储对象引用,它是在调用委托时生成的。然后可以使用相同的委托来调用具有不同对象的目标方法。

未绑定的委托与C ++成员函数指针的语法匹配。在C ++中,绑定的委托没有直接的等价物。