我终于明白了如何使用委托,但我真的搞不懂为什么要用委托而不是方法调用。我发现这个答案贴得很低,但我不知道这两个之间有什么大的区别,因为我可以简单地说
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);发布于 2012-01-21 04:18:56
不同之处在于,您告诉CalcMyTotal使用哪种方法--函数组合。CalcMyTotal不知道所涉及的任何一种方法(或者您可以想象出的任何其他方法)--也不需要知道。它所需要知道的就是“你给我一种做某事的方法,我就会去做”。在一个更典型的例子中,CalcMyTotal所做的不仅仅是调用方法,例如:
var somethingTricky = LotsOfWork(amt);
var intermediateValue = calcTotal(somethingTricky);
return SomeMoreWork(intermediateValue);这里的要点是:调用者不需要知道CalcMyTotal内部发生了什么-它只需要提供一些机制来“计算总数”;CalcMyTotal也不需要知道涉及到的任何机制。您可以将其视为单方法接口。
为了完整性,您还可以这样做(可能更清楚):
public static double CalcMyTotal(double amt, Func<double,double> calcTotal) {...}(注意Func<...>的用法),并使用lambda语法调用:
double tot1 = CalcMyTotal(100.34, amt => amt * 0.014);发布于 2012-01-21 04:20:40
这是因为你正在处理微不足道的例子……
想象一下,如果你是一个库的设计者,你希望其他人将不同的方法传递到CalcMyTotal中。
或者..。也许更简单,当有人单击用户界面上的按钮时,您希望能够插入不同的功能,以便在单击按钮时执行不同的操作
发布于 2012-01-21 04:18:39
一些区别是:
https://stackoverflow.com/questions/8947347
复制相似问题