【问题标题】:Using a Delegate Parameter From Another Class As A Function Argument.使用来自另一个类的委托参数作为函数参数。
【发布时间】:2009-11-05 01:20:16
【问题描述】:

在 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);
   }
}

另外,我想像这样在class b 中使用这个receivData 函数:

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*/
   }
}

如果有必要在class b 中声明processData,请告诉我。

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

【问题讨论】:

    标签: c# delegates


    【解决方案1】:

    您不需要多次声明委托类型,实际上这会在您的示例中引起问题。

    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);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的回复。有没有更好的方法来做到这一点。必须在不同的类中声明相同的委托听起来是多余的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 2013-11-17
      • 1970-01-01
      相关资源
      最近更新 更多