文档介绍:Delegate,Action,Func,Predicate的使用与区别 C#,类似Linq,Lamda表达式等许多新的程序写法层次不穷。与之相关的Delegate,Action,Func,Predicate的使用和区别也常常让大家迷惑,此处就结合实际的应用,对其进行详细的说明。在书写代码时,常常会用到委托,这个在winform下较常见,但自定义Delegate时,我们常常发现Delegate必须全局可见,才能在需要的地方进行使用,而对于私有的delegate对象,在本类中进行使用,这似乎是不方便的。下边我们来看传统的Delegate的写法。 public delegate voidMyDelegate(stringname); public classMyBlogBase { privateMyDelegate mydelegate; } 必须保证MyDelegate放在类的外边,才能在其他地方可见,并使用,Action,Func的出现改变了这一局面,这两个其实说白了就是系统定义好的Delegate,他有很多重载的方法,便于各种应用情况下的调用。他在系统的System命名空间下,因此全局可见。下文就说明Action,Action有多个重载,下文已Action<T>为例进行说明 Action<T>:封装一个方法,该方法只有一个参数并且不返回值。其中T是可接收的任何类型。使用代码如下: public classMyBlogBase { publicstringmyName; Action<string>myAction; publicMyBlogBase() { //myAction=delegate(stringcurName){myName=curName;}; //myAction=newAction<string>(SetAction); myAction=curname=>{myName=curname;}; } privatevoidSetAction(stringname) { myName=name; } } 在上例中,给出了3种使用Action的方法,方法一:采用匿名委托,方法二:指定一个实际的方法。方法三:使用Lamda表达式。以上3中用法均可运行。在实际应用中要比原始的定义Delegate方便,灵活。那么Func呢? Func<Tin,TTresult>:封装一个具有一个参数并返回TResult 参数指定的类型值的方法。其实个人感觉,Func和Action的区别很明显,也很直接。二者都是委托,但Func能返回函数执行结果,而Action返回类型是Void,这个区别很明显,在具体的项目中,也很容易确定该使用那个。下文就说明具体Func的代码调用: publicstringmyName; Func<string,string>myFunc; publicMyBlogBase() { //myFunc=delegate(stringcurName){();}; //myFunc=newFunc<string,string>(SetFunc); myFunc=name=>{();}; } privatestringSetFunc(stringname