首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# (Un)中的委托解释示例-看起来与出现的方法调用相同

C# (Un)中的委托解释示例-看起来与出现的方法调用相同
EN

Stack Overflow用户
提问于 2012-01-21 04:16:38
回答 4查看 536关注 0票数 2

我终于明白了如何使用委托,但我真的搞不懂为什么要用委托而不是方法调用。我发现这个答案贴得很低,但我不知道这两个之间有什么大的区别,因为我可以简单地说

代码语言:javascript
运行
复制
double tot1 = CalcTotalMethod1(100.34);
double tot2 = CalcTotalMethod2(100.34);

而不是

代码语言:javascript
运行
复制
double tot1 = CalcMyTotal(100.34, CalcTotalMethod1);
double tot2 = CalcMyTotal(100.34, CalcTotalMethod2);

这是一个示例:

代码语言:javascript
运行
复制
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);
EN

回答 4

Stack Overflow用户

发布于 2012-01-21 04:18:56

不同之处在于,您告诉CalcMyTotal使用哪种方法--函数组合。CalcMyTotal不知道所涉及的任何一种方法(或者您可以想象出的任何其他方法)--也不需要知道。它所需要知道的就是“你给我一种做某事的方法,我就会去做”。在一个更典型的例子中,CalcMyTotal所做的不仅仅是调用方法,例如:

代码语言:javascript
运行
复制
var somethingTricky = LotsOfWork(amt);
var intermediateValue = calcTotal(somethingTricky);
return SomeMoreWork(intermediateValue);

这里的要点是:调用者不需要知道CalcMyTotal内部发生了什么-它只需要提供一些机制来“计算总数”;CalcMyTotal也不需要知道涉及到的任何机制。您可以将其视为单方法接口。

为了完整性,您还可以这样做(可能更清楚):

代码语言:javascript
运行
复制
public static double CalcMyTotal(double amt, Func<double,double> calcTotal) {...}

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

代码语言:javascript
运行
复制
double tot1 = CalcMyTotal(100.34, amt => amt * 0.014);
票数 4
EN

Stack Overflow用户

发布于 2012-01-21 04:20:40

这是因为你正在处理微不足道的例子……

想象一下,如果你是一个库的设计者,你希望其他人将不同的方法传递到CalcMyTotal中。

或者..。也许更简单,当有人单击用户界面上的按钮时,您希望能够插入不同的功能,以便在单击按钮时执行不同的操作

票数 4
EN

Stack Overflow用户

发布于 2012-01-21 04:18:39

一些区别是:

  • 委托允许multicasting (即,委托类型的多个元素在其调用列表中)。
  • 委托允许调用者和被调用的特定函数之间的某种程度的解耦。
  • 上面的委托允许将委托发送到对订阅者和实现一无所知的函数中。然后,您就有了一个发布者/订阅者pattern.
  • Delegates的实现,它是创建事件的垫脚石,它使用委托来通知0到N个订阅者某个特定事件已经发生的事实,并将描述事件详细信息的数据传递给所有订阅者。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8947347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档