Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#相当于c++;回拨_C#_C++14 - Fatal编程技术网

c#相当于c++;回拨

c#相当于c++;回拨,c#,c++14,C#,C++14,我想创建一个c#回调代码,用户在其中发送自己要执行的函数。 我是新来c#的,所以我找不到合适的方法来做这件事。 等效C++代码为 class Test { bool (*signin)(int); bool (*signout)(); public: void Register(bool(*usignin)(int), bool(*usignout)()) { signin = usignin; signout = usignout

我想创建一个c#回调代码,用户在其中发送自己要执行的函数。 我是新来c#的,所以我找不到合适的方法来做这件事。 等效C++代码为

class Test
{
    bool (*signin)(int);
    bool (*signout)();
public:
    void Register(bool(*usignin)(int), bool(*usignout)())
    {
        signin = usignin;
        signout = usignout;
    }
    void display(int a,int b)
    {
        signin(a + b);
        signout();
    }
};
主要功能:

bool signin(int i)
{
    cout << i << endl;
    return true;
}
bool signout()
{
    cout << "Signed out" << endl;
    return true;
}
int main()
{
    Test *obj = new Test();
    obj->Register(signin, signout);
    obj->display(4,6);
}
bool符号(inti)
{

cout在现代C#中,一种常见的方法是将参数定义为
Action
(无返回类型,
void
)或
Func
(带有返回类型),并在调用时传递lambdas或普通函数

因此,在您的案例中,相应的注册签名似乎是:

void Register(Func<int, bool> signin, Func<bool> signout)

注意:
int
在这里的lambda中应该是可选的。

取决于您是想要完全相同的实现还是想要一种通知类型的机制

我建议在每种语言中寻找最佳解决方案。例如,在C#中,您可以使用EventHandler、委托或实现例如observer模式

事件处理程序:


观测者模式:

那么你能告诉我如何在显示函数中使用注册函数吗?我如何在显示函数中使用注册函数吗?你可以使用相同的模式:在类中定义字段,使用相同类型的构造函数参数。在构造函数中分配字段(当然,如果愿意的话,还可以对它们进行null检查)然后调用它们就像你调用函数一样,就像C++版本中所做的一样。如果你为字段保存相同的名字,代码< >代码>代码>函数将完全相同。学习。关心下投票吗?(至少提出一个你为什么不同意的评论)
Register((int id) => { Console.WriteLine($"logged in user with id {id}!"; return true; }, () => { Console.WriteLine("Sign out callback called."); return true; });