除了调用具有大量参数的方法(并且可能支持.NET 3.5之前的代码)之外,是否有任何理由来定义自定义委托而不仅仅使用Func和Action?
答案 0 :(得分:2)
到目前为止未提及的一个方面是Func
和Action
不支持ref
和out
参数。但是代表们可以拥有它们。
答案 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,我只会创建一个自定义委托:
您倾向于在.NET代码库中看到一些自定义委托的原因是,当C#是版本1并且没有匿名委托,lambdas或泛型时,很多部分是在很早就设计的。因此,大多数需要委托类型的操作都需要自定义委托。