今天我在考虑宣布这一点:
private delegate double ChangeListAction(string param1, int number);
但是为什么不使用这个:
private Func<string, int, double> ChangeListAction;
或者,如果ChangeListAction
没有返回值,我可以使用:
private Action<string,int> ChangeListAction;
那么使用delegate
关键字声明委托的优势在哪里呢?
是不是因为.NET 1.1,.NET 2.0带来了Action<T>
,.NET 3.5带来了Func<T>
发布于 2010-12-19 19:02:48
优点是清晰度。通过为类型指定一个明确的名称,读者可以更清楚地了解它的用途。
在编写代码时,它也会对您有所帮助。如下所示的错误:
cannot convert from Func<string, int, double> to Func<string, int, int, double>
并不像下面这样说:
cannot convert from CreateListAction to UpdateListAction
这也意味着如果你有两个不同的委托,这两个委托都接受相同类型的参数,但在概念上做了两件完全不同的事情,编译器可以确保你不会意外地在你想要的地方使用另一个。
发布于 2010-12-19 19:06:13
显式声明委托可以帮助进行某些类型检查。编译器可以确保分配给变量的委托被用作ChangeListAction,而不是恰好与签名兼容的某个随机操作。
然而,声明自己的委托的真正价值在于它赋予了它语义含义。阅读代码的人可以通过它的名字知道委托在做什么。想象一下,如果您有一个具有三个int字段的类,但是您声明了一个包含三个int元素的数组。数组可以做同样的事情,但是字段的名称带来了对开发人员有用的语义信息。
当你设计像LINQ这样的通用库时,你应该使用Func,Predicate和Action委托。在这种情况下,除了它们将执行and操作或用作谓词之外,委托没有预定义的语义。
顺便说一句,Tuple与匿名类型与声明自己的类也存在类似的权衡问题。你可以把所有的东西都放在一个元组中,但是属性只是Item1,Item2,它没有告诉你类型的用法。
发布于 2010-12-19 19:10:49
正如一些答案提到的win是清晰的,您命名类型,因此它将更容易为您的api用户理解。我想说的是-在大多数情况下-为你的公共apis声明委托类型,但在内部使用Func<?,?>
是很好的。
声明委托类型的一个巨大好处是,除了给类型一个名称来命名参数之外,这将极大地提高可用性。
https://stackoverflow.com/questions/4482613
复制相似问题