c# эквивалент обратного вызова c ++ - PullRequest
1 голос
/ 22 апреля 2020

Я хочу создать код обратного вызова 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);
}

В основной функции пользователь определяет свой собственный вход и выход и отправляет его через функцию регистрации. Как это можно сделать в c#?

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Обычный способ сделать это в современном C# состоит в том, чтобы определить аргументы как Action<> (без возвращаемого типа, void) или Func<> (с возвращаемым типом) и передать лямбду или обычную функцию, когда named.

Таким образом, соответствующая сигнатура Register в вашем случае выглядит следующим образом:

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

и вызывается так же, как в c ++, передавая имя определенных функций в Ваш код или напрямую с лямбдами:

Register((int id) => { Console.WriteLine($"logged in user with id {id}!"; return true; }, () => { Console.WriteLine("Sign out callback called."); return true; });

Примечание: int должен быть необязательным в лямбде здесь.

0 голосов
/ 22 апреля 2020

Зависит от того, хотите ли вы точно такую ​​же реализацию или хотите механизм уведомления типа.

Я бы посоветовал искать лучшее решение для каждого языка. Например, в C# вы можете использовать EventHandler, делегаты или реализовать, например, шаблон наблюдателя.

EventHandler: https://www.c-sharpcorner.com/blogs/delegates-and-eventhandler-for-events-in-c-sharp

шаблон наблюдателя: https://refactoring.guru/design-patterns/observer/csharp/example

...