2013-05-12 85 views
2

除了调用具有很多参数的方法(并且可能支持.NET 3.5前代码),是否有任何理由来定义自定义委托而不是仅使用Func和Action?是否有任何理由来定义自定义代表?

+1

当然,公共标识符应该有很好的描述性名称。 – 2013-05-12 10:34:03

回答

1

在功能上并不是真的。在可读性方面,我能想象的唯一事情就是更加明确。请看下面的例子:

public delegate void MessageHandler(string msg); 

// user custom delegate 
public sub DoSomething(MessageHandler handler){} 

// use generic action 
public sub DoSomething(Action<string> handler){} 

您可以在这里看到的第一个版本是更为明确,因为它准确地定义什么是预期的,因此您的客户端代码将更具可读性:

DoSomething(new MessageHandler(somefunc)); 

DoSomething(msg => ...); 
1

在现代的C#代码,你是对的,很少需要创建一个自定义委托。对于C#4,我只会创建一个自定义代理:

  • 当有多个参数时,为了提高可读性和自我记录。
  • 如果委托人的姓名可以向API的用户传递意思
  • 也许对于某些P/Invoke操作,现在不能想到任何权利。

为什么你会看到在.NET代码库中一些定制代表的原因是,大部分是被设计相当早,在C#是版本1,也没有匿名委托,lambda表达式或仿制药。因此,大多数需要委托类型的操作都需要自定义委托。

2

目前尚未提及的一个方面是FuncAction不支持refout参数。不过,代表们可以拥有它们。