使用另一个类的委托参数作为函数参数。

时间:2009-11-05 01:20:17

标签: c# delegates

在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#中传递函数指针的正确方法吗?

2 个答案:

答案 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)

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