首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >手动创建委托与使用Action/Func委托

手动创建委托与使用Action/Func委托
EN

Stack Overflow用户
提问于 2010-12-19 18:58:57
回答 5查看 17.6K关注 0票数 73

今天我在考虑宣布这一点:

代码语言:javascript
复制
private delegate double ChangeListAction(string param1, int number);

但是为什么不使用这个:

代码语言:javascript
复制
private Func<string, int, double> ChangeListAction;

或者,如果ChangeListAction没有返回值,我可以使用:

代码语言:javascript
复制
private Action<string,int> ChangeListAction;

那么使用delegate关键字声明委托的优势在哪里呢?

是不是因为.NET 1.1,.NET 2.0带来了Action<T>,.NET 3.5带来了Func<T>

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-19 19:02:48

优点是清晰度。通过为类型指定一个明确的名称,读者可以更清楚地了解它的用途。

在编写代码时,它也会对您有所帮助。如下所示的错误:

代码语言:javascript
复制
cannot convert from Func<string, int, double> to Func<string, int, int, double>

并不像下面这样说:

代码语言:javascript
复制
cannot convert from CreateListAction to UpdateListAction

这也意味着如果你有两个不同的委托,这两个委托都接受相同类型的参数,但在概念上做了两件完全不同的事情,编译器可以确保你不会意外地在你想要的地方使用另一个。

票数 61
EN

Stack Overflow用户

发布于 2010-12-19 19:06:13

显式声明委托可以帮助进行某些类型检查。编译器可以确保分配给变量的委托被用作ChangeListAction,而不是恰好与签名兼容的某个随机操作。

然而,声明自己的委托的真正价值在于它赋予了它语义含义。阅读代码的人可以通过它的名字知道委托在做什么。想象一下,如果您有一个具有三个int字段的类,但是您声明了一个包含三个int元素的数组。数组可以做同样的事情,但是字段的名称带来了对开发人员有用的语义信息。

当你设计像LINQ这样的通用库时,你应该使用Func,Predicate和Action委托。在这种情况下,除了它们将执行and操作或用作谓词之外,委托没有预定义的语义。

顺便说一句,Tuple与匿名类型与声明自己的类也存在类似的权衡问题。你可以把所有的东西都放在一个元组中,但是属性只是Item1,Item2,它没有告诉你类型的用法。

票数 10
EN

Stack Overflow用户

发布于 2010-12-19 19:10:49

正如一些答案提到的win是清晰的,您命名类型,因此它将更容易为您的api用户理解。我想说的是-在大多数情况下-为你的公共apis声明委托类型,但在内部使用Func<?,?>是很好的。

声明委托类型的一个巨大好处是,除了给类型一个名称来命名参数之外,这将极大地提高可用性。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4482613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档