C#委托回调
为什么要用委托回调呀?有什么意义?怎么样去理解委托回调啊?纠结ing.........希望大家能给点建议或者提供一些比较好的讲解委托回调的连接,谢谢。
[解决办法]
本帖最后由 caozhy 于 2011-06-29 10:08:11 编辑 将算法中某种行为提前给调用者去实现。
比如:
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;
}
调用:
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(...)
...
这些函数在遍历算法上相同,但是筛选的依据不同,于是相同的程序就要写很多次。
你有什么办法把这些方法写入一个函数,同时具有无限扩展性呢?
比如有人提出,我查找年龄不这么找,我找年龄是偶数的人(好奇怪的需求)。
用委托的代码很简单,查找函数不用改,用如下调用即可:
list = FindPerson(delegate(Person p) { return p.Age % 2 == 0; });
foreach (var item in list)
{
Console.WriteLine(item);
}
再比如,查找姓张的人
list = FindPerson(delegate(Person p) { return p.Name.SubString(0, 1) == "张"; });
foreach (var item in list)
{
Console.WriteLine(item);
}
随着功能的增多,不使用委托的代码要么出现很多很多重复的方法,或者是一个很复杂的 switch case 分支,而且每次新的需求都要修改函数实现。
[解决办法]
个人感觉“委托回调”这样组合在一起不合适。因为这是两个概念,不应该放在一起。拆分开来:什么是委托什么是回调函数,委托是有官方定义的,基本可以理解为“方法的指针”,而回调也可以理解为“委托指向(调用)的方法/函数”。
[解决办法]
http://ms.itpub.net/viewthread.php?tid=478366&extra=page%3D1%26amp%3Bfilter%3Ddigest
http://blog.csdn.net/ChengKing/archive/2006/01/07/57265
[解决办法]
都是方法指针