C#委托回调

 将算法中某种行为提前给调用者去实现。

比如:

C# code
   
   
List < Person > FindPerson(Predicate < Person > condition) { List < Person > list = new List < Person > (); foreach ( var p in Persons) { if (condition(p)) list.Add(p); } return list; }

调用:
C# code
   
   
List < Person > list; // 查找名字叫张三的人。 list = FindPerson( delegate (Person p) { return p.Name == " 张三 " ; }); foreach ( var item in list) { Console.WriteLine(item); } // 查找年龄在20~30岁的人。 list = FindPerson( delegate (Person p) { return p.Age >= 20 && p.Age <= 30 ; }); foreach ( var item in list) { Console.WriteLine(item); } // 查找职务角色是经理的人 list = FindPerson( delegate (Person p) { return p.Role == RoleType.Manager; }); foreach ( var item in list) { Console.WriteLine(item); }


在这段代码中,调用者提前定义行为(筛选什么样的数据),而算法(查找人员的方法),它只管遍历。

如果没有委托,你怎么写?

你得写
FindPersonByName(string Name)
FindPersonByAge(int MinAge, int MaxAge)
FindPersonByRole(RoleType type)
FindPersonByXXX(...)
...

这些函数在遍历算法上相同,但是筛选的依据不同,于是相同的程序就要写很多次。

你有什么办法把这些方法写入一个函数,同时具有无限扩展性呢?
比如有人提出,我查找年龄不这么找,我找年龄是偶数的人(好奇怪的需求)。

用委托的代码很简单,查找函数不用改,用如下调用即可:

C# code
   
   
list = FindPerson( delegate (Person p) { return p.Age % 2 == 0 ; }); foreach ( var item in list) { Console.WriteLine(item); }


再比如,查找姓张的人

C# code
   
   
list = FindPerson( delegate (Person p) { return p.Name.SubString( 0 , 1 ) == " " ; }); foreach ( var item in list) { Console.WriteLine(item); }



随着功能的增多,不使用委托的代码要么出现很多很多重复的方法,或者是一个很复杂的 switch case 分支,而且每次新的需求都要修改函数实现。

 

(原帖地址:http://topic.csdn.net/u/20110629/09/c652a6f9-c3b1-4ae7-9b76-80efa69f6063.html?89021

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值