做项目一段时间,经常用到委托和一些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>:封装一个方法,该方法只有一个参数并且不返回值。
原文:http://blog.csdn.net/luckyzhoustar/article/details/43195315