最佳实践:我何时应该在.NET中使用委托?

时间:2009-08-18 17:28:11

标签: c# .net delegates

  

可能重复:
  Delegate Usage : Business Applications
  Where do I use delegates?

您好,

我对.NET中委托的概念不熟悉 - 我还没有真正使用它们并且认为它们可能存在的原因很充分 - 我应该何时使用委托?

非常欢迎例子。

7 个答案:

答案 0 :(得分:8)

代表提供了一种将行为作为参数传递的方法。

常见的例子是事件和异步编程,其中除了你的对象以外的东西负责调用你的对象。您使用委托提供该事件,现在它可以运行与该委托相关联的行为。

在实现通用算法时,这也是一种有用的技术。曾经有一段时间我在编写非常相似的多种方法。也许它们循环使用相同的数据集,但它们执行的任务略有不同。我可以将委托传递给单个函数来执行该任务,然后从循环内部通过数据调用委托。这样我就不必多次在数据上实现循环了,我只需要编写新代码来做新事物 - 常见的行为都是以通用的方式捕获的。

回应评论:

从循环内调用委托和从循环内调用方法之间的区别在于委托是包含循环的函数的参数。这意味着该函数可以执行任何操作,而不仅仅是在特定方法中定义的内容。可以并且已经利用这种灵活性在库中提供通用算法,完全独立于算法的具体内容。 Linq是代表们灵活性所允许的普遍性的一个很好的例子。

答案 1 :(得分:4)

当您需要告诉另一段代码 做某事时,代表很有用。事件是最简单的例子 - 将事件(发生的事情)与如何分开处理它。其他示例是一些常见的迭代操作,例如自定义查找:

List<Foo> foos = new List<Foo>();
foos.Find(delegate(Foo foo)
    {
        if(foo.CustomProperty.Contains("special value"))
        {
            return false;
        }
        return true;
    });

以上是一个完全随意的例子,但指出你可以将(迭代和运行“查找”标准)与如何(如何确定是否找到某些东西)分开。

答案 2 :(得分:3)

另外,我建议使用通用委托类型而不是创建自己的委托类型。以下示例:

EventHandler< TEventArgs>
Func< TResult>
Func< T1, T2, TResult>
Func等...
Action< T1>
Action< T1, T2>
行动等...

答案 3 :(得分:2)

Events在幕后使用代表。

如果您使用的是事件,那么您已经使用了代理,但只是使用了更好的语法。

基本上,它们的一个用途是用于回调或基于事件的编程。

答案 4 :(得分:2)

代表用于事件驱动编程。最佳实践通常是解耦代码(或“松散”耦合)。使用委托你可以订阅事件的方法,而不是在发生某事时让X调用Y,然后Y在某种条件下调用Z,等等。

答案 5 :(得分:2)

.NET指南中的

Events and Callbacks解释得很清楚。

总之,您应该更喜欢简单API中的事件,因为有强大的IDE支持,并且大多数开发人员都对事件感到满意。但是,如果您需要用户提供将要执行的代码,则应考虑使用委托或虚拟成员。回调的性能较差,但如果使用ActionFunc之类的委托,则允许使用lambdas。

答案 6 :(得分:1)

示例案例:多个对象正在使用单个资源。资源需要对这些对象进行异步回调,但资源的性质要求在给定时间只有一个请求处于活动状态,并且该请求与特定对象相关联。由于体系结构,我不想将对象传递给资源,因此,我从每个对象发送资源委托,并将这些委托与对象标识符一起存储。发出请求时,我可以查找相应的对象标识符并调用其特定的委托。

我最初用一个事件实现了这个,但由于事件无法“针对”特定对象,我遇到了问题。我不确定这是最好的做法,但它似乎对我有用。