C#代表,为什么我们需要它们?

时间:2016-12-02 17:10:39

标签: c# callback delegates

我试图理解“回调模式”。每个答案都说这是由代表们完成的(我知道他们)。但答案的代码是这样的:

public delegate void Callback(string result);

public void Test()
{
    CallBack callback = CallbackFunction; 
    DoWork(callback);
}

public void DoWork(CallBack callback)
{
    callback("Hello world");
}

public void CallbackFunction(string result)
{
    Console.WriteLine(result);
}

我真的不明白,为什么我们需要代表呢?我们也可以这样做吗?

public void Test()
{
    DoWork();
}

public void DoWork()
{
    CallbackFunction("Hello world");
}

public void CallbackFunction(string result)
{
    Console.WriteLine(result);
}

除此之外,例如在Java中,回调意味着在事件发生后实际“返回”主程序的“特定功能”。但是当我们使用委托时,这不仅仅是在调用另一种方法吗?

我们如何进行最终在失败时调用OnFail()方法的回调,以及在成功时调用OnSuccess()方法。我真的很困惑。有人可以帮助我理解这个吗?

1 个答案:

答案 0 :(得分:0)

委托安全地将方法,一种模板封装到其签名中的函数中。有时很容易认为它是指向函数的指针。

在您的示例中,CallbackFunction可以设置为Callback,因为它们的定义只需要一个字符串参数。

您可以使用ActionFunc代替delegate。它们之间的区别在于Action不会返回某些内容而Func会返回。样本:

public void Test(Action success, Action<Exception> error)
{
    try
    {
        // perform some task
        success();
    }
    catch (Exception ex)
    {
        error(ex);
    }
}

并使用它:

Test(() => { Console.WriteLine("Success"); },
     (ex) => { Console.WriteLine($"Error: {ex.Message}"); });

Action的泛型选项是您可以传递给此方法的参数类型。在示例中,Exception是一个传递给error Action的参数。这同样适用于Func<>,但Func的最后一种类型是结果类型。