2011-09-07 109 views
1

绑定和非绑定代表有什么区别?CLI/C++中绑定和非绑定代理之间的区别

继承人如何创建两种类型的代表:

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

你可以显示'HandlerClass'的代码吗? 'Fun1'是静态的吗? –

+0

yup Fun1是静态的 –

+0

然后它很清楚,是不是 - 一个版本是免费函数,一个是(非静态)成员函数。 –

回答

2

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

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

+0

那么,绑定代表的匹配就是一个'pair '我想...... –

+0

我认为, std :: bind(&foo :: bar,obj,_1,_2,_3)'。 –

相关问题