【问题标题】:Using delegate Types vs methods使用委托类型和方法
【发布时间】:2011-03-03 00:24:34
【问题描述】:

我看到系统命名空间中提供的委托类型的使用越来越多(Action<T>Predicate<T> 等)。由于这些是委托,我的理解是它们应该用于我们过去传统上使用委托的地方(异步调用;启动线程,事件处理等)。在以下场景中使用这些委托类型只是偏好还是被认为是一种做法;而不是调用我们声明的方法(或匿名方法):

public void MyMethod()
{
      Action<string> action = delegate(string userName
      {
            try
            {
               XmlDocument profile = DataHelper.GetProfile(userName);
               UpdateMember(profile);
            }
            catch (Exception exception)
            {
               if (_log.IsErrorEnabled) _log.ErrorFormat(exception.Message);
               throw (exception);
            }
      };

      GetUsers().ForEach(action);
}

起初,我发现代码不像使用声明或匿名方法那样直观。我开始用这种方式编码,想知道这方面的观点是什么。上面的例子都在一个方法中。此委托是否过度使用?

【问题讨论】:

  • 此代码可能在正确的门后:osnews.com/story/19266/WTFs_m 如果函数式编程适合您,请考虑使用 F#。
  • 感谢您的回答(以及出色的链接)。是的!当您第一次看到以这种方式编码的内容时,我同意存在 WTF 的事实。但就像任何新事物一样,总会有一个 WTF 时刻,直到你花时间去看看它并弄清楚它。在此之后,您识别未来的模式,不再有 WTF。如果这种编码方式没有问题(比如性能);这可以仅仅被认为是一种“风格”的编码吗?

标签: c# c#-2.0


【解决方案1】:

对于一个简单的foreach 循环,我更喜欢普通的语言结构 - 请参阅this blog post for Eric Lippert's view。我认为在这里使用代表有点无缘无故。

在其他情况下——尤其是使用 LINQ——这很有意义。

委托是一种允许专业化的好方法,而无需声明和实现接口或从类型派生以覆盖方法的开销……当然,一切都要适度。如果您有几种方法要实现(并且您真的想为所有方法指定行为),那么接口更有意义。如果您真的在创建一个专门的 type,那么派生和覆盖是有意义的。但是,如果您想要一种策略模式,那么委托会非常巧妙地工作。

【讨论】:

  • 感谢您的回答和链接。我认为对于 LINQ,您的意思是因为您可能有一个数字或语句(过滤器等)来塑造列表中包含的数据 - 然后将对其进行操作。这与仅执行一些程序方法调用不同,就像我的问题中的示例一样。
  • @Grant:我的意思是 LINQ 在所有地方都使用委托(或表达式树)。在各处编写 Where 的过滤逻辑、Select 的投影逻辑等毫无意义——而在 ForEach 与 foreach 的情况下,使用委托并没有真正获得任何好处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多