//person类 public class Person { private string name; public string Name { get { return name; } set { name = value; } } private int age; public int Age { get { return age; } set { age = value; } } private string role; public string Role { get { return role; } set { role = value; } } } // public class DelegateClass { private List Psersons; /// /// 待筛选的person集合 /// public List Persons { get { return Psersons; } set { Psersons = value; } } public List FindPerson(Predicate condition) { List list = new List(); foreach (var p in Persons) { if (condition(p)) list.Add(p); } return list; } }//委托函数调用 class Program { static void Main(string[] args) { List list = new List(); Person people = new Person(); people.Name = "FrankPeng"; people.Age = 25; people.Role = "软件工程师"; list.Add(people); Person people1 = new Person(); people1.Name = "Jack"; people1.Age = 30; people1.Role = "项目主管"; list.Add(people1); Person people2 = new Person(); people2.Name = "James"; people2.Age = 36; people2.Role = "总监"; list.Add(people2); DelegateClass deleCall = new DelegateClass(); deleCall.Persons = list; //查找名字叫张三的人。 list = deleCall.FindPerson(delegate(Person p) { return p.Name == "张三"; }); foreach (var item in list) { Console.WriteLine("姓名为张三的人:"); Console.WriteLine(item.Name); Console.WriteLine(item.Age); Console.WriteLine(item.Role); Console.WriteLine("============================"); } //查找年龄在20~30岁的人。 list = deleCall.FindPerson(delegate(Person p) { return p.Age >= 20 && p.Age <= 30; }); foreach (var item in list) { Console.WriteLine("年龄在20~30岁的人:"); Console.WriteLine(item.Name); Console.WriteLine(item.Age); Console.WriteLine(item.Role); Console.WriteLine("============================"); } ////查找职务角色是总监 list = deleCall.FindPerson(delegate(Person p) { return p.Role == "总监"; }); foreach (var item in list) { Console.WriteLine("职位为总监的人是:"); Console.WriteLine(item.Name); Console.WriteLine(item.Age); Console.WriteLine(item.Role); Console.WriteLine("============================"); } } }
在这段代码中,调用者提前定义行为(筛选什么样的数据),而算法(查找人员的方法),它只管遍历。
如果没有委托,你怎么写?
你得写
FindPersonByName(string Name)
FindPersonByAge(int MinAge, int MaxAge)
FindPersonByRole(RoleType type)
FindPersonByXXX(...)
...
这些函数在遍历算法上相同,但是筛选的依据不同,于是相同的程序就要写很多次。
你有什么办法把这些方法写入一个函数,同时具有无限扩展性呢?比如有人提出,我查找年龄不这么找,我找年龄是偶数的人(好奇怪的需求)。用委托的代码很简单,查找函数不用改,用如下调用即可:
你得写
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);
}
随着功能的增多,不使用委托的代码要么出现很多很多重复的方法,或者是一个很复杂的 switch case 分支,而且每次新的需求都要修改函数实现。
如果没有委托,你怎么写?
你得写
FindPersonByName(string Name)
FindPersonByAge(int MinAge, int MaxAge)
FindPersonByRole(RoleType type)
FindPersonByXXX(...)
...
这些函数在遍历算法上相同,但是筛选的依据不同,于是相同的程序就要写很多次。
你有什么办法把这些方法写入一个函数,同时具有无限扩展性呢?比如有人提出,我查找年龄不这么找,我找年龄是偶数的人(好奇怪的需求)。用委托的代码很简单,查找函数不用改,用如下调用即可:
你得写
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);
}
随着功能的增多,不使用委托的代码要么出现很多很多重复的方法,或者是一个很复杂的 switch case 分支,而且每次新的需求都要修改函数实现。
相关推荐
详解C#委托,事件与回调函数
C# 实现回调函数C# 实现回调函数C# 实现回调函数C# 实现回调函数C# 实现回调函数
自己写的C#用户多线程委托回调函数,直接可以用.net4.0调试通过
c#线程结束后,实现的委托回调函数源码 线程结束,通知主线程,并且可以实现对主线程控件的安全访问
告诉你怎么用C#委托处理dll中的回调函数。有几篇文档在里面
C#回调函数示例 + VS2013 代码
c#回调函数,十分清晰简单易懂
19.C#中委托、事件和回调函数的理解.pdf 19.C#中委托、事件和回调函数的理解.pdf
c#的回调函数(delegate关键字)
一个Demo,描述了C#如何在C++中注册函数并回调
c#调用C++动态库、执行回调函数,并回传结构体参数数据。vs2017环境编写C#和C++动态库,这个为完整工程例子,可供相关人员学习参考。
用C#传递回调函数给ATL,由ATL调用触发。
附件是一套C#调用C++dll时,实现回调函数的Demo程序。亲测可用。
halcon外触发get_framegrabber_callback注册回调函数方法,c#代码
C# 回调CV++ DLL 三种方法 和 多类之间共享一个回调函数,VS2010下运行, 整个DLL中共享使用一个回调函数
C# 回调函数委托源码,可直接运行,有助于初学者理解委托和回调。其实回调就是委托的一种用法
委托回调
一个是C++的DLL以及源码 一个是调用他的C#源码 都是VS2010编译测试通过
回调函数的认识,和大概理解,大家交流学习