在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*/
}
}
如果processData
中class b
的声明是必要的,请与我们联系。
这是在C#中传递函数指针的正确方法吗?
答案 0 :(得分:3)
您不需要委托类型的多个声明,实际上这会导致您的示例出现问题。
a.receiveData需要a.processData类型的委托。但是当你在b中新建一个processData委托时,会找到b.processData类型 - 这是一个不同的类型(即使它具有相同的签名)。
因此,您应该从b中删除委托类型声明,并将您的呼叫更改为:
a.receivData(new a.processData(b.dataHandler));
但实际上显式new是不必要的:因为b.dataHandler具有正确的签名,C#编译器将插入一个隐式转换到a.processData,所以你可以写:
a.receivData(b.dataHandler);
答案 1 :(得分:1)
是的,该方法应具有相同的签名