日期:2014-05-17  浏览次数:21073 次

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
------解决方案--------------------
都是方法指针