有没有理由定义自定义代理?

时间:2013-05-12 10:00:54

标签: .net c#-4.0

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

3 个答案:

答案 0 :(得分:2)

到目前为止未提及的一个方面是FuncAction不支持refout参数。但是代表们可以拥有它们。

答案 1 :(得分: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 => ... );

答案 2 :(得分:1)

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

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

您倾向于在.NET代码库中看到一些自定义委托的原因是,当C#是版本1并且没有匿名委托,lambdas或泛型时,很多部分是在很早就设计的。因此,大多数需要委托类型的操作都需要自定义委托。