`

委托回调函数的妙用(c# code )

 
阅读更多
   //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 分支,而且每次新的需求都要修改函数实现。
分享到:
评论

相关推荐

    Beginning Visual C# 2010 Programming code

    6. **委托与事件**:委托是C#中的类型,可以引用方法,常用于实现回调和事件处理。事件则是一种特殊的委托,常用于组件间的通信。 7. **泛型**:泛型允许在不指定具体数据类型的情况下定义类、接口和方法,提高了...

    Context Delegate Source C# - C# Source code

    在异步方法中,`Task.Run` 和 `Task.Factory.StartNew` 可以配合上下文委托,确保回调函数在正确的上下文中执行。这对于保持UI响应性和性能优化至关重要。 4. **文件CtxDelegateSample.zip和CtxDelegate.zip**: ...

    Professional C# 2008 1-12

    委托是实现回调函数的关键,而事件则用于处理对象间的通信。异步编程,如使用`async`和`await`关键字,是处理耗时操作的重要手段,它能提高程序的响应性。 `ch11 CodeSample`和`Ch12 CodeSample`可能涉及C#的高级...

    Code samples for Functional Programming in C#.zip

    两者结合使用,可以实现事件处理、回调函数等功能。 9. **Expression Trees** 表达式树(Expression Trees)将代码表示为数据结构,这使得我们可以分析、修改甚至在运行时执行代码。在LINQ中,表达式树用于构建...

    一篇文章彻底搞清楚c#中的委托与事件

    那么先来看c#中的委托定义,先来个例子: public delegate void GetPacage(string code); 这个委托,看起来就是个方法签名,取包裹,需要验证码。与方法签名不同的地方,在于多了一个delegate。c#中不乏一些便利...

    C#编写的模拟鼠标点击和移动操作源码

    2. **处理钩子事件**:创建一个`HookProc`委托类型的回调函数,当有鼠标事件发生时,此函数会被调用。在这个函数中,我们可以获取鼠标事件的详细信息,并进行模拟点击。 ```csharp private static int MouseProc...

    C# 入门经典 Chapter 14 Code -- revised

    通过使用委托和事件,你可以实现非阻塞编程和回调机制。 2. **匿名方法与Lambda表达式**:在C#中,匿名方法允许我们在不定义单独的方法的情况下直接使用代码块。Lambda表达式是匿名方法的简洁形式,它们可以被用作...

    C#学习重点,核心资料分享

    委托可以被用来实现事件机制、异步编程和回调函数等。 在C#中,委托可以被定义为一个类型,它包含一个方法的签名。例如,下面的代码定义了一个委托: ```csharp public delegate void NumberChangedEventHandler...

    C# 中操作API,作为初学者来说,在C#中使用API确是一件令人头疼的问题。在使用API之间你必须知道如何在C#中使用结构、类型转换、安全/不安全代码,可控/不可控代码等许多知识。

    在API设计中,它们常用于回调函数或事件处理。了解如何声明、实例化和使用委托对于处理异步API或响应式API至关重要。 8. **异常处理**: API调用可能会抛出异常,因此编写良好的异常处理代码是必要的。使用`try-...

    Professional C# 2008 13-23

    4. **委托与事件**:委托是C#中实现回调函数的方式,而事件则用于处理异步操作和用户界面交互。这两者在GUI编程中尤为重要。 5. **异步编程**:C# 2008可能涉及到异步编程模型,如Begin/End方法对,以及如何处理多...

    C#初学入门代码案例

    9. **委托与事件**:委托是C#中的类型安全的函数指针,常用于实现回调和事件处理。事件是基于委托的,允许对象之间异步通信。 10. **LINQ(Language Integrated Query)**:C#的查询表达式提供了一种直观的方式来...

    c#入门经典习题代码(最新版)

    8. **委托与事件**:理解事件处理机制,学习如何使用委托来实现回调函数。 9. **泛型**:泛型允许我们创建可以适用于多种数据类型的类、接口和方法,提高代码的复用性。 10. **LINQ(Language Integrated Query)*...

    清华大学C#课件

    2. **匿名方法与Lambda表达式**:使用匿名方法简化回调函数,以及Lambda表达式的使用,它们在 LINQ 查询中尤为重要。 3. **匿名类型**:创建未命名的类型,通常用于临时存储数据。 4. **动态类型**:使用dynamic...

    Professional C# 5.0 and .NET 4.5.1源代码(2-22)

    委托和事件是C#中实现回调和响应式编程的重要机制。 3. 第18章的源代码(18_Code.zip):此章节可能讨论了并发和异步编程,这是现代应用中处理多核处理器和网络I/O的关键技术。C# 5.0引入了async/await关键字,使得...

    CLR via C# 4th源码

    源码将解释如何使用委托创建回调函数,以及如何实现事件订阅和发布。 6. **反射**:反射允许程序在运行时动态地获取类型信息并操作对象。源码中会有如何动态创建和调用方法、访问属性和字段、以及动态加载和执行...

    C#技术资料C#技术资料

    - **委托与事件**:支持回调函数和事件处理,常见于UI编程。 - **匿名方法和Lambda表达式**:简化代码,常用于LINQ查询。 - **泛型**:提供类型安全的数据结构,如List、Dictionary, TValue&gt;等。 - **异步编程**...

    Microsoft Visual C# .NET (Core Reference) (VBL)

    3. 委托和事件:委托是类型安全的函数指针,常用于实现回调机制;事件则用于对象间通信,特别是在UI编程中。 4. Lambda表达式和LINQ:Lambda表达式简化了匿名函数的编写,而LINQ(Language Integrated Query)提供了...

    Chapter03Code.zip

    9. **内联函数与委托**:内联函数可以提高代码的运行效率,而委托则允许我们将方法作为参数传递,实现函数回调,这是事件处理的基础。 10. **数组与集合**:C#中的数组是固定大小的内存块,而集合如List则提供了...

Global site tag (gtag.js) - Google Analytics