本文转载自:http://www.cnblogs.com/zhouji432600/archive/2010/05/30/1747383.html
在.net3.5里面,委托的定义和实现被大大的简化了!使用关键字Func或Action就可以定义一个委托,使用拉姆达表达式就可以实现一个具体的委托.
Func关键字是用来定义一个有返回值的委托,它一共有五个重载,我们介绍其中的三个
1 public delegate TResult Func<TResult>();
这表示一个没有参数,只有一个返回值的委托,返回值的类型就是TResult(泛型)
1publicclasstest
2{
3///<summary>
4///定义一个委托
5///</summary>
6publicFunc<string>_GetName;
7///<summary>
8///一个普通的没有参数,有返回值的方法
9///</summary>
10///<returns></returns>
11publicstringGetName()
12{
13return"张三";
14}
15publicvoidMain()
16{
17//3.5以前的委托的实现,直接赋值
18_GetName=GetName;
19
20//拉姆达表达式的@R_403_369@
21_GetName=(
22()//因为这个委托没参数,所以参数列表没有东西
23=>//拉姆达表达式的符号
24{//大括号的代码段表示具体的委托的实现
25return"还是张三";
26});
27//拉姆达表达式的简写,如果委托的实现代码段中只有一句return则可以省略代码段最外面的大括号,和return关键字
28_GetName=()=>"总是张三";
29//调用
30stringMyName=_GetName();
31}
32}
2 public delegate TResult Func<T,TResult>(T arg);
这表示有且仅有一个参数,并且有返回值的委托.
1publicclasstest
2{
3///<summary>
4///定义一个委托,有一个参数和一个返回值
5///</summary>
6publicFunc<string,string>_GetName;
7///<summary>
8///有一个参数的方法
9///</summary>
10///<paramname="strName">这是一个参数!</param>
11///<returns>这是一个返回值</returns>
12publicstringGetName(stringstrName)
13{
14returnstrName;
15}
16publicvoidMain()
17{
18//3.5以前的委托的实现,直接赋值
19_GetName=GetName;
20
21//拉姆达表达式的@R_403_369@
22_GetName=(
23(S)//有一个参数!所以参数列表里面有一个东西,这个东西随大家高兴叫个阿猫阿狗都行!只要符合规范
24=>//拉姆达表达式的符号
25{//大括号的代码段表示具体的委托的实现
26return"还是"+S;
27});
28//拉姆达表达式的简写,和return关键字
29_GetName=(abc)=>"总是"+abc;
30//调用
31stringMyName=_GetName("张三");
32}
33}
3 public delegate TResult Func<T1,T2,TResult>(T1 arg1,T2 arg2);
这表示有且仅有两个参数,int,string>_GetName;
7///<summary>
8///这是一个有两个参数的方法,方法的参数类型的顺序必须和委托的参数类型顺序一致
9///</summary>
10///<paramname="strName">第一个是字符类型</param>
11///<paramname="intAGE">第二个是整形,请不要颠倒类型!</param>
12///<returns>返回一个字符串,对应委托的最后一个参数</returns>
13publicstringGetName(stringstrName,intintAGE)
14{
15returnstring.Format("{0}的年龄是{1}岁",strName,intAGE);
16}
17publicvoidMain()
18{
19//3.5以前的委托的实现,直接赋值
20_GetName=GetName;
21
22//拉姆达表达式的@R_403_369@
23_GetName=(
24(S,W)//有一个参数!所以参数列表里面有一个东西,这个东西随大家高兴叫个阿猫阿狗都行!只要符合规范
25=>//拉姆达表达式的符号
26{//大括号的代码段表示具体的委托的实现
27returnstring.Format("{0}的年龄是{1}岁",S,W);
28});
29//拉姆达表达式的简写,和return关键字
30_GetName=(abc,efd)=>string.Format("{0}的年龄是{1}岁",abc,efd);
31//调用
32stringMyName=_GetName("张三",33);
33}
34}
Action关键字用来定义一个没有返回值的方法,它有一个非泛型方法,和四个泛型方法,一共五种.Action和func的区别就在于一个没有返回值,一个有返回值!其他的都一样!就好像VB的sub和function一样!
1 public delegate void Action();
没有参数也没有返回值
1publicclasstest
2{
3///<summary>
4///定义一个委托,没有返回值也没有参数
5///</summary>
6publicAction_GetName;
7
8publicvoidGetName()
9{
10System.Windows.Forms.MessageBox.Show("没有参数也没有返回值,我只要自己显示了!");
11}
12publicvoidMain()
13{
14//3.5以前的委托的实现,直接赋值
15_GetName=GetName;
16
17//拉姆达表达式的@R_403_369@
18_GetName=(
19()
20=>//拉姆达表达式的符号
21{//大括号的代码段表示具体的委托的实现
22System.Windows.Forms.MessageBox.Show("没有参数也没有返回值,我只要自己显示了!");
23});
24//因为action没有返回值,所以下面的简写方式是错误的
25//_GetName=()=>System.Windows.Forms.MessageBox.Show("没有参数也没有返回值,我只要自己显示了!");
26//调用
27_GetName();
28}
29}
2 public delegate void Action<T>(T obj);
有一个参数但没有返回值
1publicclasstest
2{
3///<summary>
4///定义一个委托,没有返回值也没有参数
5///</summary>
6publicAction<bool>_GetName;
7
8publicvoidGetName(boolblnShow)
9{
10if(blnShow)
11{
12System.Windows.Forms.MessageBox.Show("要我显示就显示,多没面子");
13}
14else
15{
16System.Windows.Forms.MessageBox.Show("不要我显示,我偏要显示");
17}
18}
19publicvoidMain()
20{
21//3.5以前的委托的实现,直接赋值
22_GetName=GetName;
23
24//拉姆达表达式的@R_403_369@
25_GetName=(
26(b)
27=>//拉姆达表达式的符号
28{//大括号的代码段表示具体的委托的实现
29if(b)
30{
31System.Windows.Forms.MessageBox.Show("要我显示就显示,多没面子");
32}
33else
34{
35System.Windows.Forms.MessageBox.Show("不要我显示,我偏要显示");
36}
37});
38
39_GetName(true);
40}
41}
不过通常func和action并不是单独定义,然后使用,而是当作某个方法的参数的类型!下一次使用linq的方法,讲解一下func和action作为参数的写法
原文链接:https://www.f2er.com/vb/261123.html