我目前正在将 c++ 迁移到 c#,我提出了以下问题,我没有在 c# 中完成的最微弱的想法
typedef void (CALLBACK *funtion1)(int a , int b);
void SetCallBackFuntion(funtion1 pfn);
void something(){
obj->SetCallBackFuntion(&funtion1);
}
有几种方法可以在 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);
想到的最后一种方法是使用事件处理程序,但由于当您的回调有多个订阅者时它们更有用,所以我不会在这里介绍它们。
可以用 C# 简单地用委托编写