c# - C# 中的委托(delegate)(未解释)示例 - 看起来与方法调用相同

标签 c# delegates

我终于明白了如何使用委托(delegate),但无法真正弄清楚为什么要使用委托(delegate)而不是方法调用。我发现这个答案粘贴在下面,但我无法弄清楚这两者之间的最大区别是什么,因为我可以简单地说

double tot1 = CalcTotalMethod1(100.34);
double tot2 = CalcTotalMethod2(100.34);

代替

double tot1 = CalcMyTotal(100.34, CalcTotalMethod1);
double tot2 = CalcMyTotal(100.34, CalcTotalMethod2);

这是一个例子:

public static double CalcTotalMethod1(double amt)
{
    return amt * .014;
}

public static double CalcTotalMethod2(double amt)
{
    return amt * .056 + 42.43;
}


public delegate double calcTotalDelegate(double amt);

public static double CalcMyTotal(double amt, calcTotalDelegate calcTotal)
{
    return calcTotal(amt);
}

double tot1 = CalcMyTotal(100.34, CalcTotalMethod1);
double tot2 = CalcMyTotal(100.34, CalcTotalMethod2);
Console.WriteLine(tot1);
Console.WriteLine(tot2);

最佳答案

区别在于你告诉CalcMyTotal使用哪种方法 - 功能组合。 CalcMyTotal不知道所涉及的任何一种方法(或任何其他你能想到的方法)——也不需要。它只需要知道“你给我一个做某事的方法,我就会去做”。在一个更典型的例子中,CalcMyTotal会做一些比调用方法更多的事情,例如:

var somethingTricky = LotsOfWork(amt);
var intermediateValue = calcTotal(somethingTricky);
return SomeMoreWork(intermediateValue);

这里的要点:调用者不需要知道CalcMyTotal里面发生了什么- 它只需要提供一些机制来“计算总计”;和 CalcMyTotal不需要了解所涉及的机制。您可以将其视为单一方法接口(interface)。

为了完整起见,您也可以这样做(也许更清楚):

public static double CalcMyTotal(double amt, Func<double,double> calcTotal) {...}

(注意 Func<...> 用法),并使用 lambda 语法调用:

double tot1 = CalcMyTotal(100.34, amt => amt * 0.014);

关于c# - C# 中的委托(delegate)(未解释)示例 - 看起来与方法调用相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8947347/

相关文章:

c# - 创建可序列化匿名委托(delegate)的替代方案

c# - 如何在 Windows CE 中捕获命名事件

c# - 如何在不内存溢出的情况下按需访问数千张图像

c# - 循环依赖的依赖注入(inject)

c# - 我破坏了封装吗?

C# 从 native 线程修改 UI

在现有 LinkedList<T> 中添加新项的 C# 最佳方法?

c# - 如何从 Blazor @code block 中的单选/复选框表单提交中获取数据?

ios - 从非 UIViewController 类在 UIViewController 上设置标签文本

c# - foreach 循环中的匿名委托(delegate)