2009-11-05 29 views
0

在C或C++,可以使用函数指针作为参数传递给另一个这样的功能:如果方法使用另一个类的委托参数作为函数参数。

int example(FUNPTR a) 
{ 
    /* call the function inside */ 
    a(); 
} 

而且我也知道,我们可以在C#中使用委托作为函数指针,但什么 我想分配给另一个类中存在的委托,这是否意味着这两个类都需要有相同的委托声明?

例如:

class a 
{ 
    public delegate void processData(Byte[] data); 

    public void receivData(ProcessData dataHandler) 
    { 
     NetworkStream stream; 
     Byte[] data_buffer = new Byte[100]; 

     /* receive data from socket interface */ 

     stream.Read(data_buffer, 0, data_buffer.Length); 

     dataHandler(data); 
    } 
} 

另外,我想用这个receivData功能class b这样的:

class b 
{ 

    public delegate void processData(Byte[] data); 

    class a = new a(); 

    a.receivData(new processData(b.dataHandler)); 

    public void dataHandler(Byte[] array) 
    { 
     /* handling of the array*/ 
    } 
} 

请让我知道如果processDataclass b的声明是必要的。

这是在C#中传递函数指针的正确方法吗?

回答

3

你不需要委托类型的多个声明,而事实上,这将导致在你的榜样的问题。

a.receiveData期待a.processData类型的委托。但是当你在b中新建一个processData委托时,它会找到b.processData类型 - 这是一个不同的类型(即使它具有相同的签名)。

所以,你应该删除从B委托类型声明,您的电话更改为:

a.receivData(new a.processData(b.dataHandler)); 

但事实上,明确新的不必要的:因为b.dataHandler具有正确的签名,C#编译器会插入一个隐式转换到a.processData,所以你可以写:

a.receivData(b.dataHandler); 
0

是的,此方法应具有相同的签名

+0

感谢您的答复。有没有更好的方式来做到这一点。不得不在不同的类中声明相同的代表听起来多余。 – alex 2009-11-05 01:34:10

相关问题