1

我目前正在将 c++ 迁移到 c#,我提出了以下问题,我没有在 c# 中完成的最微弱的想法

typedef void (CALLBACK *funtion1)(int a , int b);

void SetCallBackFuntion(funtion1 pfn);


void something(){

obj->SetCallBackFuntion(&funtion1);

}
4

2 回答 2

1

有几种方法可以在 C# 中实现等效行为,具体取决于您希望它如何工作以及您所针对的 .NET 版本。最简单的方法是使用Action

要使用 C# 标准实现这一点,首先应注意它更适合作为属性而不是方法。此外,因为回调不返回值,所以它被称为方法,而不是函数。所以上面的代码看起来像这样:

public Action<int,int> CallBack { set; }

public void Something()
{
    obj.CallBack = function1;
}

调用回调的代码将执行以下操作:

if(CallBack != null)
    CallBack(1, 2);

另一种方法是使用委托,这只是描述动作的一种稍微冗长的方式,并且与旧版本的 .NET 兼容。它还可以更紧密地与 C++ 代码进行转换。注意:尽管这在技术上可行(假设您正确实施了其余部分),但通常不被视为良好做法。我只是想向您展示一种快速而肮脏的方式。

public delegate void CallBack(int x, int y);

private void SetCallBackFuntion(CallBack pfn)
{
}

private void Something()
{
    obj.SetCallBackFuntion(funtion1);
}

第三种方法是使用接口。你可以用你的方法签名来描述一个接口,如下所示:

public interface IMyInterface
{
    void CallBack(int x, int y);
}

然后你可以在你的类上有一个类似于 Action 但使用接口的属性。

public IMyInterface CallBackObject { set; }

public void Something()
{
    obj.CallBackObject = someObject;
}

if(CallBackObject != null)
    CallBackObject.CallBack(1, 2);

想到的最后一种方法是使用事件处理程序,但由于当您的回调有多个订阅者时它们更有用,所以我不会在这里介绍它们。

于 2012-08-14T06:18:42.753 回答
0

可以用 C# 简单地用委托编写

于 2012-08-14T05:38:59.420 回答