分享

委托 你怎么看?

 昵称10504424 2013-10-22
对于委托给自己的感觉一直都是,知其然,而不知其所以然,而对于程序员来说,对于自己不是很了解的领域总是缺少安全感,为了有安全感于是我定好好理解一翻,

以下是自己的一点总结,如有不对,还请在评论中指出,谢谢。

 

二 自定义委托

2.1 什么是委托

  委托和类一样是一种用户自定义的类型,但类表示的是数据的集合,而委托保存是的一个或多个方法 (精简版)。

     我觉得委托像是一个快递公司,我们只要把包裹给它,它就会帮我们送到指定的地方。而委托就是把方法赋值给它,然后在指定的地方调用委就行了。

2.2 委托常规操作

     对于委托的一些常规操作就不多写了,比较简单就 一代(一段代码)而过了。

  

 

2.3 匿名方法

     2.2中的代码赋给委托的方法都是 “具名方法”,可以重复使用的,如果赋给委托的方法只需要调用一次呢?定一个方法是不是太浪费了呢,

那匿名方法就出场了,什么是匿名方法我就不解释了,看名字就知道了。写一写使匿名方法的注意点:

1  必须要有 delegate类型关键字,

2  必须要与委托的参数返回值匹配

好了上代码 

有了匿名方法后是不是感觉方便清爽很多呢 不用再去定义一个方法了少了很多代码。

那 delegate(int x) { return x + 20; }; 这段代码能否再简化一点呢,那是肯定的 这个时候就要引入 "Lambda"表达示了 “=>”

有了lambda表达示后可以将匿名方法转换为lambda表达示写法

关于Lambda表达 式的参数列表的要点如下

1 lambda表达式的参数列表 中的参数必须在参数数量,类型和位置上与委托 相匹配。

2 表达 式的参数列表中的参数不一定需要包含类型(比如隐式类型),除非委托 有ref 或out 参数这时类型是必须的

3 如果只有一个参数,并且是隐式类型的周围的圆括号就可以省略,否则就是必须的

4 如果没有参数,必须使用一组空括号

 

三 .net Freamwork定义的委托

3.1  Action泛型委托 

       Action是没有返回值的泛型委托,可以有0-16个参数

   

 3.2  Func 委托 

  可以有0-16个参数,但是返回类型是必须要的 如0个参数的Func委托 :Func<TResult> func  这里的TResult指得就是返回类型

 3.3  Predicate委托

  Predicate只有一个参数,且返回值为bool类型

四  委托综合应用

复制代码
 1     internal class PeopleInfo
 2     {
 3         public int Id { get; set; }
 4 
 5         public string Name { get; set; }
 6 
 7         public int Age { get; set; }
 8     }
 9 
10 
11             var peopleList = new List<PeopleInfo>();
12             peopleList.Add(new PeopleInfo() { Id = 1, Name = "Zery", Age = 20 });
13             peopleList.Add(new PeopleInfo() { Id = 2, Name = "Zhang", Age = 25 });
14             /*==============Action 委托===================*/
15             //自定义委托
16             peopleList.ForEach(delegate(PeopleInfo x) { Console.WriteLine("姓名:{0} 年龄:{1}", x.Name, x.Age); });
17             
18             //Action 委托
19             Action<PeopleInfo> action = x => Console.WriteLine("姓名:{0} 年龄:{1}", x.Name, x.Age);
20             peopleList.ForEach(action);
21             
22             //Lambda表达示
23             peopleList.ForEach(o=> Console.WriteLine("姓名:{0} 年龄:{1}",o.Name,o.Age));
24 
25             //全部输出: 姓名:Zery 年龄:20
26             //         姓名:Zhang 年龄:25   
27 
28             /*==============Func 委托=====================*/
29             //自定义委托
30             var deleFValue = peopleList.Where(delegate(PeopleInfo x) { return x.Name == "Zery"; });
31             Console.WriteLine(deleFValue.FirstOrDefault().Name);
32 
33             //Func 委托
34             Func<PeopleInfo, bool> func = x => x.Name=="Zery";
35             var funcFValue = peopleList.Where(func);
36             Console.WriteLine(funcFValue.FirstOrDefault().Name);
37 
38             //Lambda表达示
39             var lamaFValue = peopleList.Where(o => o.Name == "Zery");
40             Console.WriteLine(lamaFValue.FirstOrDefault().Name);
41 
42             //全部输出:"Zery"
43              
44 
45             /*==============Predicate 委托================*/
46             //自定义委托
47             var delePValue = peopleList.Find(delegate(PeopleInfo x) { return x.Age == 25; });
48             Console.WriteLine(delePValue.Name);
49 
50             //Predicate 委托 
51             Predicate<PeopleInfo> predicate = x => x.Age == 25;
52             var preValue = peopleList.Find(predicate);
53             Console.WriteLine(preValue.Name);
54 
55             //Lambda表达示
56             var lamPValue = peopleList.Find(o=> o.Age==25);
57             Console.WriteLine(lamPValue.Name);
58 
59             //全部输出:"Zhang"
复制代码

五 总结

    当写完这篇文章时,对委托的理解有了一个较为全面的了解,扫去了自己的又一个盲区,成长的过程是缓慢的,关键在于坚持。

    如果您觉得本文有给您带来一点收获,不妨点个推荐,为我的付出支持一下,谢谢~

    如果希望在技术的道路上能有更多的朋友,那就关注下我吧,让我们一起在技术的路上奔跑

成长在于积累

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多