//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 分支,而且每次新的需求都要修改函数实现。
相关推荐
6. **委托与事件**:委托是C#中的类型,可以引用方法,常用于实现回调和事件处理。事件则是一种特殊的委托,常用于组件间的通信。 7. **泛型**:泛型允许在不指定具体数据类型的情况下定义类、接口和方法,提高了...
在异步方法中,`Task.Run` 和 `Task.Factory.StartNew` 可以配合上下文委托,确保回调函数在正确的上下文中执行。这对于保持UI响应性和性能优化至关重要。 4. **文件CtxDelegateSample.zip和CtxDelegate.zip**: ...
委托是实现回调函数的关键,而事件则用于处理对象间的通信。异步编程,如使用`async`和`await`关键字,是处理耗时操作的重要手段,它能提高程序的响应性。 `ch11 CodeSample`和`Ch12 CodeSample`可能涉及C#的高级...
两者结合使用,可以实现事件处理、回调函数等功能。 9. **Expression Trees** 表达式树(Expression Trees)将代码表示为数据结构,这使得我们可以分析、修改甚至在运行时执行代码。在LINQ中,表达式树用于构建...
那么先来看c#中的委托定义,先来个例子: public delegate void GetPacage(string code); 这个委托,看起来就是个方法签名,取包裹,需要验证码。与方法签名不同的地方,在于多了一个delegate。c#中不乏一些便利...
2. **处理钩子事件**:创建一个`HookProc`委托类型的回调函数,当有鼠标事件发生时,此函数会被调用。在这个函数中,我们可以获取鼠标事件的详细信息,并进行模拟点击。 ```csharp private static int MouseProc...
通过使用委托和事件,你可以实现非阻塞编程和回调机制。 2. **匿名方法与Lambda表达式**:在C#中,匿名方法允许我们在不定义单独的方法的情况下直接使用代码块。Lambda表达式是匿名方法的简洁形式,它们可以被用作...
委托可以被用来实现事件机制、异步编程和回调函数等。 在C#中,委托可以被定义为一个类型,它包含一个方法的签名。例如,下面的代码定义了一个委托: ```csharp public delegate void NumberChangedEventHandler...
在API设计中,它们常用于回调函数或事件处理。了解如何声明、实例化和使用委托对于处理异步API或响应式API至关重要。 8. **异常处理**: API调用可能会抛出异常,因此编写良好的异常处理代码是必要的。使用`try-...
4. **委托与事件**:委托是C#中实现回调函数的方式,而事件则用于处理异步操作和用户界面交互。这两者在GUI编程中尤为重要。 5. **异步编程**:C# 2008可能涉及到异步编程模型,如Begin/End方法对,以及如何处理多...
9. **委托与事件**:委托是C#中的类型安全的函数指针,常用于实现回调和事件处理。事件是基于委托的,允许对象之间异步通信。 10. **LINQ(Language Integrated Query)**:C#的查询表达式提供了一种直观的方式来...
8. **委托与事件**:理解事件处理机制,学习如何使用委托来实现回调函数。 9. **泛型**:泛型允许我们创建可以适用于多种数据类型的类、接口和方法,提高代码的复用性。 10. **LINQ(Language Integrated Query)*...
2. **匿名方法与Lambda表达式**:使用匿名方法简化回调函数,以及Lambda表达式的使用,它们在 LINQ 查询中尤为重要。 3. **匿名类型**:创建未命名的类型,通常用于临时存储数据。 4. **动态类型**:使用dynamic...
委托和事件是C#中实现回调和响应式编程的重要机制。 3. 第18章的源代码(18_Code.zip):此章节可能讨论了并发和异步编程,这是现代应用中处理多核处理器和网络I/O的关键技术。C# 5.0引入了async/await关键字,使得...
源码将解释如何使用委托创建回调函数,以及如何实现事件订阅和发布。 6. **反射**:反射允许程序在运行时动态地获取类型信息并操作对象。源码中会有如何动态创建和调用方法、访问属性和字段、以及动态加载和执行...
- **委托与事件**:支持回调函数和事件处理,常见于UI编程。 - **匿名方法和Lambda表达式**:简化代码,常用于LINQ查询。 - **泛型**:提供类型安全的数据结构,如List、Dictionary, TValue>等。 - **异步编程**...
3. 委托和事件:委托是类型安全的函数指针,常用于实现回调机制;事件则用于对象间通信,特别是在UI编程中。 4. Lambda表达式和LINQ:Lambda表达式简化了匿名函数的编写,而LINQ(Language Integrated Query)提供了...
9. **内联函数与委托**:内联函数可以提高代码的运行效率,而委托则允许我们将方法作为参数传递,实现函数回调,这是事件处理的基础。 10. **数组与集合**:C#中的数组是固定大小的内存块,而集合如List则提供了...