委托Action,Func,Predicate是平时开发中使用的较多的系统预定义委托类型。三者均位于.Net类库的System 命名空间下。本文将对三者中的Action委托做一个简单的介绍,希望能为那些对此感兴趣的朋友带来一定的帮助。
说明(必须的):这里的Action委托指的是委托定义中含有Action关键字的一类委托。我们知道这样的一类委托包括:“Action 委托”(就是怕和你混淆了),“Action<T> 委托”,“Action 〈T,T〉委托”等等,文中不特别说明的话,“Action 委托”就指的是“Action 这类委托”(略显麻烦,但是我也确实找不到好的表述方式,请见谅)。
在给出Action 委托的定义之前,先来看一个简单的Action 委托的实例。
直接上代码,如下:
Action<string> printAction = delegate(string printString)
{
Console.WriteLine(printString);
};
printAction("Hello World!");
上面的代码首先利用匿名方法创建了委托Action<string>的委托实例printAction,再调用委托实例printAction输出字符串"Hello World!"。
这里插入几句:不知道大家对委托是怎么理解的。
我个人现阶段对委托的理解是,委托准确的说是委托类型,利用这种类型可以创建对应的委托实例,最后可以调用创建的委托实例完成操作。委托类型只定义了一个方法的接口,而委托实例可以看成是实现了那个接口的一个对象。
我们的例子中其实使用到的是预定义委托类型Action<T> 委托,下面给出msdn上对此委托类型的定义:
结合我们给出的实例其实可以很好的理解上面的这个定义。在例子中,我们创建的匿名方法含有一个参数并且没有返回任何值,所以该匿名方法可以被用来创建该委托类型的委托实例,因为该匿名方法的签名与此委托类型所封装的方法接口一致。
同样,在msdn上,我们发现Action委托具有以下这样一些委托类型:
对于他们的定义,我想大家应该很容易看懂,无非就是:不返回任何值,唯一的区别就是它们所能接受的参数个数不一样,那么所能接受的参数最多最少是多少呢?0-16个。
所以,到这里我们可以下结论:
Action委托这类委托是系统预定义的一类委托类型的集合,该类委托不具有返回值,可以接受0-16个参数,所以在实际开发中,满足这种要求的地方其实都是可以考虑一下Action委托的。
还有一些细节需要说明一下;
(1)定义中出现的“T”代表的是泛型类型参数。而Action<T>,Action<T,T>,...其实是泛型委托类型。(关于泛型,本文不会涉及到,所以大家可以参考其他资料好好研究一番,哈哈哈)
(2)在查看泛型委托类型的语法定义时,在泛型类型参数前常常能见到“in”和“out”关键字,表明该类型参数是逆变和协变的。(关于逆变和协变,本文同样不会涉及到,所以大家可以参考其他资料好好研究一番,呵呵呵)
(3)还有匿名方法,本文也使用到了,但是没做过多说明,要是有疑问,也请参考MSDN说明文档。嘿嘿嘿。