做项目一段时间,经常用到委托和一些Lambda表达式,在这里也对这些东西总结一下。
1.什么是委托?
说实在的,用了这么多,突然让说一下委托的定义,确实还有难度。在我看来,委托跟平常的方法差不多,但是功能却十分的强大。强大到什么地方呢?方法中可以有参数,委托既然类似于方法,所以也有参数,但是参数的内容可以是方法。
2.委托用法
委托在用法上与类的用法又特别的相同,比如在使用某个类的时候,必须先进行实例化。下面看一个Demo
<span style="font-family:SimSun;font-size:18px;">namespace ConsoleApplication1 { public class B { //定义一个委托对象 //因为委托中传入的是方法,在此委托就好比是一些方法的模型 //比如这时定义的一个委托,就要求传入的方法返回值是void //参数必须是一个string类型的字符串 delegate void Test(string name); //测试方法一 public static void Test1(string name) { Console.WriteLine(name); } //测试方法二 public static void Test2(string age) { Console.WriteLine(age); } //使用委托 static void Main(string[] args) { //使用委托 //用法与类相似,用前必须先实例化一个委托对象 Test test = new Test(Test1); //通过实例化后,该委托就成为了方法的一个代理 test("校长"); Console.ReadLine(); } } }</span>
小结:通过上述代码,我们也看到,在用法上委托与类相似,在功能上与方法相似。
3.匿名委托
看了上述的代码,基本上算是对委托有了初步的理解,只要掌握以下用法即可。下面来看一下,匿名委托,与委托一样,只不过变了一下模样而已。
<span style="font-family:SimSun;font-size:18px;"> public class C { static void Main(string[] args) { //以前用的时候还需要实例化,现在又了匿名的委托 //不用再实例化委托对象了 //采用Lambda表达式书写的一个匿名委托 DelCompare del = (t1, t2) => { return t1+t2; }; //直接匿名委托 DelCompare del1 = delegate(int t1,int t2) { return t1+t2; }; //调用委托方法 int n = del(3, 4); int n1 = del1(3, 4); } }</span>
上述代码只不过是在委托的基础上,变了一下型而已。到底,通过上述两次代码展示,我们已经知道用委托的方法已经有三种形式了。
4.异步委托
小编在学习委托的时候,看了一下MSDN文档,发现了一个好东西。异步委托。
BeginInvoke 方法:在创建控件的基础句柄所在线程上异步执行指定委托。
具体的实现原理,也不是很清楚,但是看到异步执行指定委托,小编就有点兴奋了。于是小编那这个方法执行委托,与上述进行的对比,发现能够快上1000倍。什么都不说了,直接上代码吧!
<span style="font-family:SimSun;font-size:18px;"> delegate void DelTest(); public class D { //回调函数,当异步委托的方法执行完毕之后调用的方法 public static void Callback(IAsyncResult ar) { Console.WriteLine("OVER"); } static void Main(string[] args) { //实例化委托对象 DelTest del = Test; //委托的异步调用 del.BeginInvoke(Callback, null); Console.WriteLine("测试"); } public static void Test() { Console.WriteLine("测试"); } }</span>
5.Action<T> 委托和Func<T,TResult> 委托
贴心的微软,真的是为人民服务哈。看看上面我们用委托的繁琐的过程,于是微软基于这点考虑,给我们封装了两个函数。
Func<T,TResult> :封装一个具有一个参数并返回TResult 参数指定的类型值的方法。
Action<T>:封装一个方法,该方法只有一个参数并且不返回值。