Microsoft在刚开始开发.NET Framework的时候引入了委托的概念。开发人员在FCL 中添加类时,凡是有回调方法的地方都定义了新的委托类型。随着时间推移定义了许多委托。仅在MSCorLib.dll中就有近50个,举例几个:
可以看到这几个委托的共同点。它们其实都是一样的:这些委托类型的变量所引用的方法都是获取一个object,并返回void 。没理由定义这么多委托类型,留一个就行。
.NET Framwork现在支持泛型,所以实际只需几个泛型委托(在System命名空间中定义)就能表示需要获取多达16参数的方法:
这个不是泛型。
一直到16参数的。
所以,.NET Framwork现在提供了17个Action委托,它们从无参到最多16个参数。(16个参数以上需要自己定义了,这种情况极其罕见)。除了Action委托,.NET Framwork还提供了17个Func函数,允许回调方法返回值:
等等直至16个参数。
建议尽量使用这些委托类型,而不是子啊代码中定义更多的委托类型。这样可减少系统中的类型数量,同时简化编码。然而,如需使用ref 或out 关键字以传入引用方式传递参数,就可能不得不定义自己的委托:
如果委托要通过C#的params关键字获取数量可变的参数,要为委托的任何参数指定默认值,或者要对委托的泛型类型参数进行约束,也必须定义自己的委托类型。
获取泛型实参并返回值的委托支持逆变和协变,而且建议总是利用这些功能,因为它们没有副作用,而且使你的委托适用于更多的情形。