2

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

4

3 回答 3

2

到目前为止没有提到的一个方面是不支持Func和参数。不过,代表们可以拥有它们。Actionrefout

于 2013-05-12T11:22:22.067 回答
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 => ... );
于 2013-05-12T10:06:13.247 回答
1

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

  • 当有多个参数时,以提高可读性和自文档化。
  • 如果委托的名称可以向 API 的用户传达含义
  • 也许对于一些 P/Invoke 操作,现在想不出任何。

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

于 2013-05-12T10:07:29.430 回答