我终于明白了如何使用委托(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/