我看到越来越多地使用System命名空间(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);
}
首先,我发现代码比使用声明或匿名方法更不直观。我开始以这种方式编码,并想知道这方面的观点是什么。上面的例子都在一个方法中。这个代表是否过度使用?
答案 0 :(得分:4)
对于简单的foreach
循环,我更喜欢正常的语言构造 - 请参阅this blog post for Eric Lippert's view。我认为在这里使用代表是有点无偿的。
在其他情况下 - 尤其是LINQ - 它很有意义。
委托是一种很好的方式,允许专业化而不需要在声明和实现接口或从类型派生以便覆盖方法的开销......当然,所有内容都是适度的。如果您有多种方法可以实现(并且您真的想为所有方法指定行为),那么界面更有意义。如果您真正创建了一个专门的类型,那么派生和覆盖是有意义的。但是,如果您想要一个策略模式,那么代表的工作非常巧妙。