【问题标题】:Best practices: When should I use a delegate in .NET? [duplicate]最佳实践:我什么时候应该在 .NET 中使用委托? [复制]
【发布时间】:2010-11-20 16:32:14
【问题描述】:

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

嗨,

我对 .NET 中的委托概念不熟悉 - 我还没有真正使用过它们,我认为它们的存在可能是有充分理由的 - 我应该什么时候使用委托?

非常欢迎提供示例。

【问题讨论】:

标签: c# .net delegates


【解决方案1】:

Events 在幕后使用委托。

如果您使用事件,您就使用了委托,但只是使用了更好的语法。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      以上是一个完全任意的示例,但表明您可以将内容(迭代并运行“查找”标准)与 如何(如何确定是否找到某物)分开。

      【讨论】:

        【解决方案4】:

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

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

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

        回应评论:

        在循环内调用委托和从循环内调用方法的区别在于委托是包含循环的函数的参数。这意味着该函数可以做任何事情,而不仅仅是在特定方法中定义的事情。这种灵活性可以并且已经被利用来在库中提供通用算法,完全独立于算法使用的细节。 Linq 是通过委托的灵活性所允许的通用性的一个很好的例子。

        【讨论】:

        • 你的回答对我来说有点含糊。从循环中调用委托和从循环中调用简单方法有什么区别?
        【解决方案5】:

        .NET 指南中的Events and Callbacks 很好地解释了这一点。

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

        【讨论】:

          【解决方案6】:

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

          EventHandler< TEventArgs>
          Func< TResult>
          Func< T1, T2, TResult>
          功能等...
          Action< T1>
          Action< T1, T2>
          动作等...

          【讨论】:

          【解决方案7】:

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

          我最初是通过一个事件来实现的,但由于该事件无法“瞄准”特定对象,所以我遇到了问题。我不确定这是不是最佳做法,但它似乎对我很有效。

          【讨论】:

            猜你喜欢
            • 2016-04-19
            • 1970-01-01
            • 2011-09-27
            • 2014-04-06
            • 1970-01-01
            • 2012-03-18
            • 1970-01-01
            • 2011-07-26
            • 2011-06-16
            相关资源
            最近更新 更多